如何改变一个孩子的道具
How to change props of a child?
我是React新手。这可能是一个新手问题。
我想在用户单击复选框时更改MeteorGriddle组件的"filteredFields"属性。我的JSX:
const bookingsPage = () => {
let filteredFields = ['userName'];
const handleClick = (e) => {
if (e.target.checked) {
filteredFields = ['userEmail'];
// How to propagate this change to the MeteorGriddle?
}
}
return (
<div>
<label><input type="checkbox" defaultChecked="true" value="userEmail" onClick={handleClick}/>Email</label>
<MeteorGriddle filteredFields={filteredFields}/>
</div>
);
};
我知道有两种方法可以解决你的问题。
第一个简单的方法是:
把你的bookingpage组件变成有状态组件,而不是函数式组件。然后你就可以在它里面创建状态,然后在事件上改变状态,同时把它传递给MeteorGriddle组件。
所以代码应该是:
class bookingsPage extends React.Component {
getInitialState = () => {
filteredFields: []
}
handleClick = (e) => {
if (e.target.checked) {
const newFilteredFields =
[ ...this.state.filteredFields ].push('userEmail');
this.setState({ filteredFields: newFilteredFields });
}
}
render() {
return (
<div>
<label>
<input
type="checkbox"
defaultChecked="true"
value="userEmail"
onClick={this.handleClick}
/>
Email
</label>
<MeteorGriddle
filteredFields={this.state.filteredFields}
/>
</div>
);
}
};
第二种更难的方法:
看看Redux。它解决了React中的一个数据流问题。基本的概念是,当你选中你的复选框时,你向reducer分派一个动作(也就是react组件的全局数据存储),然后gridlecomcomponent接收到你的应用程序的新状态,里面有新的数据,告诉他复选框被选中了。
如果你想让我为你写一个基于你的例子
正如@Maxx所说,您应该使用带有state的组件。然后当你调用setState方法时,它会再次渲染,更新子元素的道具。
在你的情况下,这应该工作(也使用ES6符号):
import React from 'react';
import MeteorGriddle from '...whatever path...';
class bookingsPage extends React.Component {
state = {
filteredFields: ['userName']
};
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
if (e.target.checked) {
this.setState({
...this.state, //This is just a good practice to not overwrite other properties
filteredFields: ['userEmail']
});
}
}
render() {
const { filteredFields } = this.state;
return(
<div>
<label>
<input type="checkbox" defaultChecked="true" value="userEmail"
onChange={this.handleChange}/>Email
</label>
<MeteorGriddle filteredFields={filteredFields}/>
</div>
);
}
}
有许多方法可以实现这一点,您可以尝试下面的代码,
import React from 'react';
class bookingsPage extends React.Component {
state = {
filteredFields: ['userName']
};
constructor(props) {
super(props);
}
handleChange(e) {
if (e.target.checked) {
this.setState({
filteredFields: ['userEmail']
});
}
}
render() {
return(
<div>
<label>
<input type="checkbox" defaultChecked="true" value="userEmail"
onChange={this.handleChange.bind(this)}/>Email
</label>
<MeteorGriddle filteredFields={this.state.filteredFields}/>
</div>
);
}}
相关文章:
- 设置一个孩子'Firebase上带有字符串的名称
- 你能把一个组件通过道具传给孩子吗
- 当我有一个独特的孩子 + jquery 时,如何获得最后一个孩子
- 在另一个父母的孩子中更改父母
- 为什么 javascript 错误:“孩子不是一个函数”
- Javascript Array 只显示最后一个孩子
- 第一个孩子最后一个孩子 Dom 遍历不起作用
- 如果有超过 3 个孩子,则隐藏最后一个孩子
- 如果一个模型在续集中引用自身,如何让所有孩子或父母在多对多关联中
- Jquery的eq(0),“.first-child”,first()如果它是一个iframe,则不会抓住第一个孩子
- count'最后一个孩子'从javascript对象/数组结构中的任意点
- Javascript-幻灯片上的下一个/上一个按钮-新孩子需要帮助
- Javascript,我可以得到另一个函数的孩子
- 我可以orderByChildren或orderByValue减去一个孩子到另一个?(或任何其他使用计算变量的方法)
- 如何将一个孩子附加到两个父母
- 添加keyDown()函数它们是一个令人满意的群体的新孩子
- 我想知道为什么这不起作用,我所要做的就是得到一个图像,并把它作为我画布的一个阶段的孩子
- 给所有孩子围一个跨度
- 我如何卸载只有一个在this.props.children的孩子
- 在Firebase中只按日期收听最后一个孩子