【发布时间】:2016-01-30 07:31:29
【问题描述】:
类似于Pass props to parent component in React.js,但我只对将子组件的 default 道具放入父组件感兴趣。
那我为什么需要这样做呢?
嗯,我有一个父组件,它呈现一个包含 HTML 表单的子组件。父级的 render() 方法将其状态数据作为 props 向下传递给子级。
最初,子表单应该只包含一些默认数据。从子组件中定义的 defaultProps 获取数据是有意义的。毕竟,我不想为了将其作为默认道具传递给孩子而在父状态中设置默认数据负载。父母不需要定义孩子的默认道具。孩子应该知道自己的默认道具是什么。
所以在我最初的父 render() 中,我将状态保留为未定义。当它作为未定义的道具传递给孩子时,孩子将使用其 defaultProps 代替。这正是我想要的。
时间流逝……
现在用户更改子组件表单上的字段。我通过回调函数将该更改传递回父级,以重新计算父级的新状态。然后我在父组件中调用 setState() 以正常重新渲染所有子组件。
问题是我需要我父母的状态是一个对象,包含更多的嵌套对象,并且正在使用 [React Immutability Helpers][1] 来计算父母中的新状态,如下所示:
handleFormFieldChange(e) {
// reactUpdate imported from 'react-addons-update'
var newState = reactUpdate(this.state, {
formData: {values: {formFieldValues: {[e.currentTarget.name]: {$set: e.currentTarget.value}}}}
});
this.setState(newState);
}
此代码第一次运行时会抛出错误,因为它正在尝试更新状态值并且没有要更新的状态。 (我没有定义它,记住!)
如果我试图通过为空对象(每个都有嵌套的空对象)设置默认初始状态来解决这个问题,我会遇到一个 catch-22。在第一次渲染时,这些空值将作为空道具传递给子组件,因此覆盖我为子组件设置的 defaultProps。无赖!
据我所知,我需要一个合理的初始状态来传递给子组件,但无需在父组件中再次(重新)定义整个事物。所以在这种情况下,我认为将孩子的 defaultProps 拉到父母中是有意义的,只是为了设置父母的初始状态。
我有办法做到这一点,我稍后会发布。但在我这样做之前,有没有人有更好的方法来做到这一点?一种完全可以避免将 defaultProps 从子级传递给父级的方法?
【问题讨论】:
-
使用
React.Component或React.createClass? -
我使用的是 ES6 模块,所以 React.Component.
标签: reactjs