javascript - 在 React 中状态更改时重新渲染组件
问题描述
我有一个调用两个函数的应用程序;我的购物车和我的物品。我正在尝试这样做,因此当调用 MyItems 中呈现的按钮时,它会调用主应用程序组件(父级)中的一个方法并更改状态,但由于某种原因,它不会更改 MyCart 跨度中的值。
我下面的代码是我想要做的,但它不起作用,我不知道为什么。
class ShopRemake extends React.Component {
constructor() {
super();
this.state = {
total: 0
}
this.changeTotal = this.changeTotal.bind(this);
}
changeTotal() {
this.setState(prevState => {total: ++prevState.total});
console.log(this.state);
}
render() {
return (
<React.Fragment>
<MyItem changeTotal={this.changeTotal}/>
<MyCart total={this.state.total}/>
</React.Fragment>
);
}
}
function MyItem(props) {
return (
<button onClick={props.changeTotal}> Click Me </button>
);
}
function MyCart(props) {
return (
<span> Total Items: {props.total} </span>
);
}
我想要它,以便在单击按钮后 MyCart 内的跨度相应更新。
解决方案
您必须将返回的对象文字包装到箭头函数中的括号中。否则,花括号将被视为表示函数的主体。以下作品:
p => ({ foo: 'bar' })
所以调用setState
in changeTotal
:
changeTotal() {
this.setState(prevState => {total: ++prevState.total});
console.log(this.state);
}
应替换为以下内容:
changeTotal() {
this.setState(prevState => ({total: ++prevState.total}));
console.log(this.state);
}
此外,setState
是异步的,您需要等待它(不推荐)或使用回调作为第二个参数来查看结果状态:
changeTotal() {
this.setState(
prevState => ({total: ++prevState.total}),
() => { console.log(this.state) }
);
}
编辑 :
旁注,您的代码中的以下 2 个组件可以简化为箭头函数以获得完全相同的结果,同时使它们更易于阅读:
const MyItem = ({ changeTotal }) => <button onClick={changeTotal}> Click Me </button>
const MyCart = ({ total }) => <span> Total Items: {total} </span>
您还可以转换changeTotal
为箭头函数以避免在构造函数中绑定它
推荐阅读
- c - 如何在c中通读文件列表
- html - 获取文件大小 - 服务器端验证
- javascript - 使用状态变量作为样式道具值
- sqlite - 如何使用 SQLITE 处理 QTableView 上的 BLOB/TEXT
- java - 按同意时如何添加 JOptionPane
- sql - POS的SQL Server自定义数字生成并发
- angular - 从firestore获取数据时如何创建使用用户uid的服务?角度/火库
- react-native - 反应原生 FlatList 项目不随状态变化
- python - Paramiko:“不是有效的 RSA 私钥文件”
- spring-boot - GET_LIST 响应中的嵌套对象