处理 react.js 中未定义道具的最佳方式是什么?
what's the best way to deal with undefined props in react.js?
假设我有一个在页面加载时分派的操作,比如在 index.js 文件中。
例子
store.dispatch(loadData());
在我的减速器中,我将状态初始化为一个对象。像这样
function myReducer(state = {}, action)
现在我有一些智能组件可以订阅我的状态,然后将它传递给另一个组件来显示数据。此场景的另一个重要注意事项是数据的检索是异步发生的。
我们还假设此对象的键是某个数组。
所以标记组件会有这样的东西
{this.props.object.key.map(k => do something)}
现在因为 key 是未定义的,如果我在上面调用 map,我会爆炸。我处理这个问题的方法是使用一个简单的 if 检查。如果定义了键,则 运行 .map
否则 return 为空。然后,当我的数据从服务器返回时,由于该组件订阅的状态发生变化,将再次调用渲染。至此key定义完成,可以调用map了
另一种方法,是定义你的状态在减速器中的样子。换句话说,如果我知道我的状态将是一个带有数组 属性 的对象,我可能会做这样的事情。
const initialState = {
key:[]
}
function myReducer(state = initialState, action)
这样做有好处,因为现在我不需要 if 检查,因为密钥永远不会未定义。
我的问题是;这些方法中的任何一种比另一种更好吗?或者,是否有另一种方法可以完全解决这个问题?
一般来说,我喜欢采用的方法是在组件上定义具有 "empty." 语义含义的默认 props 例如,在您描述的问题的上下文中,我通常会像这样构造我的组件(ES6 类 风格):
class MyComponent extends React.Component {
static defaultProps = {
object: {
key: []
}
};
...
method() {
// this.props.object.key is an empty array, but is overriden
// with a value later after completion of the reducer
// (trigerred asynchronously)
this.props.object.key.map(doSomething);
}
}
这相对干净,可防止代码在 运行 时抛出异常,并强制您为语义 null、空或未定义的输入状态创建定义明确的行为。
假设我有一个在页面加载时分派的操作,比如在 index.js 文件中。
例子
store.dispatch(loadData());
在我的减速器中,我将状态初始化为一个对象。像这样
function myReducer(state = {}, action)
现在我有一些智能组件可以订阅我的状态,然后将它传递给另一个组件来显示数据。此场景的另一个重要注意事项是数据的检索是异步发生的。 我们还假设此对象的键是某个数组。 所以标记组件会有这样的东西
{this.props.object.key.map(k => do something)}
现在因为 key 是未定义的,如果我在上面调用 map,我会爆炸。我处理这个问题的方法是使用一个简单的 if 检查。如果定义了键,则 运行 .map
否则 return 为空。然后,当我的数据从服务器返回时,由于该组件订阅的状态发生变化,将再次调用渲染。至此key定义完成,可以调用map了
另一种方法,是定义你的状态在减速器中的样子。换句话说,如果我知道我的状态将是一个带有数组 属性 的对象,我可能会做这样的事情。
const initialState = {
key:[]
}
function myReducer(state = initialState, action)
这样做有好处,因为现在我不需要 if 检查,因为密钥永远不会未定义。
我的问题是;这些方法中的任何一种比另一种更好吗?或者,是否有另一种方法可以完全解决这个问题?
一般来说,我喜欢采用的方法是在组件上定义具有 "empty." 语义含义的默认 props 例如,在您描述的问题的上下文中,我通常会像这样构造我的组件(ES6 类 风格):
class MyComponent extends React.Component {
static defaultProps = {
object: {
key: []
}
};
...
method() {
// this.props.object.key is an empty array, but is overriden
// with a value later after completion of the reducer
// (trigerred asynchronously)
this.props.object.key.map(doSomething);
}
}
这相对干净,可防止代码在 运行 时抛出异常,并强制您为语义 null、空或未定义的输入状态创建定义明确的行为。