reactjs - PureComponent 中的受控输入不会在更改时呈现
问题描述
为什么受控输入更改时 PureComponent 不呈现
更改为 Component 解决了它
import React, { PureComponent } from 'react';
class Contact extends PureComponent {
state = {firstName:''}
handleInput = ({ target }, name) => {
const state = this.state;
state[name] = target.value;
this.setState(state);
};
render(){
return (
<input onChange={e => {
this.handleInput(e, 'firstName');
}}
value={this.state.firsName} />
)
}
}
它应该在打字时呈现新状态,但它没有
解决方案
尝试这样做:
import React, { PureComponent } from 'react';
class Contact extends PureComponent {
state = {firstName:''}
handleInput = name => ({target}) => this.setState({[name]: target.value})
render() {
return (
<input
onChange={this.handleInput('firstName')}
value={this.state.firsName} />
)
}
}
您遇到的主要问题是您直接改变了状态对象,您所做的就像这样做:this.state.someProp = 'foo'; this.setState(this.state);
,这很糟糕。你永远不应该直接改变state
.
我正在做的另一件事是我已经将该handleInput
方法转换为高阶函数......这不是必需的,但 IMO 使代码更简洁。基本上这意味着this.handleInput('whatever')
将返回一个函数,该函数接受“事件”作为其第一个(也是唯一的)参数并更新whatever
状态的属性。
推荐阅读
- java - 如何向导航抽屉项目添加操作?
- laravel - Laravel 8 API 子域无法访问
- sql - TSQL - 查询差异和聚合重叠
- razor - 剃刀文件中的覆盖方法“消失”
- javascript - 如何验证对象的属性名是否存在?
- cmake - 我在复杂的库依赖结构中缺少 CMake 的一些基本内容
- html - Puppeteer 错误:找不到匹配选择器“#save”的元素
- vba - 尝试访问在 VBA (Visio) 中运行时创建的控件的属性时出现运行时错误
- javascript - 使用正则表达式验证电子邮件模式
- multithreading - 绕过 L1/L2 的非临时存储,但缓存在 L3 中以供另一个内核读取