Cha*_*man 11 javascript reactjs react-redux
假设我有一个在页面加载时调度的动作,比如说,在index.js文件中.
例
store.dispatch(loadData());
Run Code Online (Sandbox Code Playgroud)
在我的reducer中,我将状态初始化为一个对象.像这样的东西
function myReducer(state = {}, action)
Run Code Online (Sandbox Code Playgroud)
现在我有一些智能组件订阅我的状态,然后将其传递给另一个组件来显示数据.这种情况的另一个重要注意事项是数据的检索是异步发生的.我们还假设该对象的键是某个数组.所以标记组件会有这样的东西
{this.props.object.key.map(k => do something)}
Run Code Online (Sandbox Code Playgroud)
现在因为键是未定义的,我不能在它上面调用地图而且我会爆炸.我一直在处理的方式是使用简单的if检查.如果定义了key,则运行.map否则返回null.然后,当我的数据从服务器返回时,由于该组件订阅的状态发生变化,将再次调用渲染.此时,键被定义并且可以调用map.
另一种方法是定义你的状态在reducer中的样子.换句话说,如果我知道我的状态将是一个带有数组属性的对象,我可能会做这样的事情.
const initialState = {
key:[]
}
function myReducer(state = initialState, action)
Run Code Online (Sandbox Code Playgroud)
这样做将有利于现在我不需要我的if检查,因为密钥永远不会被定义.
我的问题是; 这些方法中的任何一种都比另一种更好吗?或许,还有另一种方法可以完全解决这个问题吗?
小智 10
通常,我喜欢的方法是在组件上定义具有"空"的语义含义的默认道具.例如,在您描述的问题的上下文中,我通常会像这样构建我的组件(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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是相对干净的,防止代码在运行时抛出,并强制您为语义上为null,空或未定义的输入状态创建明确定义的行为.