javascript - 将良好实践从父状态反应到子道具
问题描述
所以我最近读了很多关于反应状态和道具的文章。我的应用程序并没有那么大,但现在我面临一个似乎对很多人来说都很常见的问题,我正在努力寻找实现这一点的最佳方法。
我的应用程序很简单。顶部的搜索栏,显示联系人列表。我的搜索栏是一个组件,正在使用 searchBar 值的结果更新 react-redux 存储(使用 axios 调用后端)。直到这里一切都很好。
当结果数组被填充(在 redux 存储中)时,我的容器会重新呈现结果数组。像这样:
class Suggestions extends Component {
render() {
console.log('before map: ', this.props.contacts);
const {
contacts,
...rest
} = this.props;
const options = contacts.map((contact, index) => (
<Contact
key={contact.id}
renderToaster={renderToasterFunction}
contact={contact}
/>
));
return <div>{options}</div>;
}
}
const mapStateToProps = (state, props) => ({
contacts: state.contact.results,
});
export default connect(mapStateToProps)(Suggestions);
问题发生在我的联系人组件中,我的列表有时会显示在同一页面上的 10 个联系人。所以我的问题是每个联系人组件都需要有自己的状态(添加或编辑信息示例:如果您需要添加新的电话号码)。
//contact component
state = {
contactState: ???
}
...
render(){
//exemple for simplicity
return <div>{this.state.contactState.name}</div>
}
我在 React 网站上发现,在孩子状态下从父母那里复制道具并不是一个好主意。就我而言,我已经看到了,因为如果我这样做
...
state = {
contactState: this.props.contact <--info from parent
}
第一次搜索没问题,但第二次搜索另一个字母,结果列表没有更新,我仍然看到第一次搜索的一些结果。
所以我试图将我的联系人组件更改为:
//contact component
state = {
contactState: ???
}
...
render(){
//exemple for simplicity
return <input value={this.props.contact.name} onChange={this.handleChange}/>
}
这在视觉更新方面效果很好,即使我进行 3-4 次搜索,我的所有联系人都会更新。但是我的问题是,现在当我想编辑名称时,我需要在保存这个和第二个问题之前将我的所有contactState 存储在某个地方,因为当我编辑它时我的组件显示 {this.props.contact.name},用户可以'看不到新值,因为我无法编辑道具。
那么有没有一种方法可以在每次父状态更改时从子中的道具呈现状态。或者有没有办法1)在用户编辑联系人时保存状态,2)显示他写的新值?
处理 .map() 以使每个子节点具有一个状态时,最好的方法是什么,当父状态更改并以新状态渲染所有子节点时,该子节点可以重新渲染。
谢谢您的帮助。如果您需要更高的精度,请不要犹豫。
解决方案
我不确定是否了解所有内容,但如果我得到您想要做的事情:
- 一个简单的解决方案可能是在 onChange 上调度一个操作
- 捕获动作的减速器将更新您的 redux 存储
- 道具会改变,视图也会改变。
但这会让你调度很多动作......其他选项:
- 在每个复制 props 的 Contact-Component 中使用状态
state = {...this.props.contact}
- 修改更改处理程序上的状态并将其也用作值。
- 保存并发送“最终名称”以更新 redux 存储并同时调用 api 以在您的服务器上更新
让我知道这是否足够清楚
推荐阅读
- swift - 以编程方式出现错误的 UIView 可滚动内容大小对于 UIScrollView 来说是不明确的。只有第一次
- firebase-authentication - 使用 Firebase 身份验证实现中等风格的“使用 google 登录”
- javascript - 尝试在 jQuery/JS 中进行页面重定向时,为什么我的页面没有呈现我需要的数据?
- batch-file - 如果超过 x 天,如何删除单个文件?
- javascript - TypeError: undefined is not an object (评估'_this3.state.bind')
- javascript - paperjs:如何将我的代码拆分为多个文件?
- python - 用字符串填充python中的3D列表
- google-maps - 如何从距离矩阵 API 中获取 duration_in_traffic
- javascript - Google Map API 显示不正确
- node.js - Mailtrap 的 Nodemailer 选项(错误:每秒电子邮件太多)