Render 方法不会重新渲染在构造函数中初始化的元素
Render method does not re-render element initialized in the constructor
当我注意到受控表单元素的行为时,我是 React 的新手并且正在试验。我有一个受控输入元素,其值绑定到父组件的状态,其 onChange 处理程序从用户那里获取输入的值并更新状态。因此,每次用户键入内容时,输入值都会反映出变化。这是理想的效果。在渲染函数中创建输入时效果很好。但是在 case 中,输入是通过在构造函数中设置的 class 变量初始化的,当状态改变时,相同的输入不会更新它的值。唯一的区别是首先初始化输入元素的地方。什么会导致这种行为?
感谢您的帮助!
下面是导致错误行为的代码示例:
class App extends React.Component {
constructor(props){
super(props);
this.state = {
val : '',
}
this.handleChange = this.handleChange.bind(this);
this.input = (
<input type="text"
onChange={this.handleChange }
value={this.state.val} />
);
}
handleChange(e){
this.setState({val:e.target.value});
}
render() {
return (
<div className="App">
{ this.input ? this.input : null }
</div>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
您已将输入存储(或缓存)到渲染器外部的变量中。因此,当您的组件更新时,它只会一次又一次地呈现您输入的缓存版本。
您需要将 this.input
定义为返回 <input>
的函数,如下所示:
this.input = () => (
<input type="text"
onChange={this.handleChange }
value={this.state.val} />
);
并在渲染中调用 this.input()
。现在,输入将在每次渲染时更新。
但是,如果您想要的只是创建对输入的引用 (this.input
),我宁愿建议在渲染中使用 the special prop ref
:
render() {
<input type="text"
onChange={this.handleChange }
value={this.state.val}
ref={input => (this.input = input)} // the magic happens here
/>
}
这样做时,您不需要在构造函数中将 this.input
定义为函数。
React 组件的构造函数仅在挂载之前调用。
如果你在构造函数中定义了一些变量,它将存储它的值而不是引用并且不会再次重新渲染。
props/state 更改时调用的函数是
- componentWillReceiveProps()
- shouldComponentUpdate()
- componentWillUpdate()
- 渲染()
- componentDidUpdate()
如果您想存储任何元素的引用,您可以使用 refs.
render() {
<input type="text"
onChange={this.handleChange }
value={this.state.val}
ref={ ele => (this.input = ele)}
/>
}
阅读更多关于 refs
当我注意到受控表单元素的行为时,我是 React 的新手并且正在试验。我有一个受控输入元素,其值绑定到父组件的状态,其 onChange 处理程序从用户那里获取输入的值并更新状态。因此,每次用户键入内容时,输入值都会反映出变化。这是理想的效果。在渲染函数中创建输入时效果很好。但是在 case 中,输入是通过在构造函数中设置的 class 变量初始化的,当状态改变时,相同的输入不会更新它的值。唯一的区别是首先初始化输入元素的地方。什么会导致这种行为? 感谢您的帮助!
下面是导致错误行为的代码示例:
class App extends React.Component {
constructor(props){
super(props);
this.state = {
val : '',
}
this.handleChange = this.handleChange.bind(this);
this.input = (
<input type="text"
onChange={this.handleChange }
value={this.state.val} />
);
}
handleChange(e){
this.setState({val:e.target.value});
}
render() {
return (
<div className="App">
{ this.input ? this.input : null }
</div>
);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
您已将输入存储(或缓存)到渲染器外部的变量中。因此,当您的组件更新时,它只会一次又一次地呈现您输入的缓存版本。
您需要将 this.input
定义为返回 <input>
的函数,如下所示:
this.input = () => (
<input type="text"
onChange={this.handleChange }
value={this.state.val} />
);
并在渲染中调用 this.input()
。现在,输入将在每次渲染时更新。
但是,如果您想要的只是创建对输入的引用 (this.input
),我宁愿建议在渲染中使用 the special prop ref
:
render() {
<input type="text"
onChange={this.handleChange }
value={this.state.val}
ref={input => (this.input = input)} // the magic happens here
/>
}
这样做时,您不需要在构造函数中将 this.input
定义为函数。
React 组件的构造函数仅在挂载之前调用。 如果你在构造函数中定义了一些变量,它将存储它的值而不是引用并且不会再次重新渲染。
props/state 更改时调用的函数是
- componentWillReceiveProps()
- shouldComponentUpdate()
- componentWillUpdate()
- 渲染()
- componentDidUpdate()
如果您想存储任何元素的引用,您可以使用 refs.
render() {
<input type="text"
onChange={this.handleChange }
value={this.state.val}
ref={ ele => (this.input = ele)}
/>
}
阅读更多关于 refs