我正在学习React并遇到这种情况。基本上,我有一个带有输入框的React组件Test,并且在其中有一个Hello组件,它可以打印出Hello +所有text用户类型。所以我期望的是,如果我键入sth,那么this.text将被更新,然后Hello组件将重新呈现。但是,这没有发生。我意识到我需要在this.state中设置“文本”,然后Hello将重新呈现。我的问题是,尽管更改了道具,但为什么不重新渲染Hello组件?预先感谢。
import ReactDOM from "react-dom";
import React, { Component } from "react";
import Hello from "./hello";
class Test extends Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.text = e.target.value;
console.log(this.text);
}
render() {
return (
<div>
<h1>Test</h1>
<form>
<input value={this.text} onChange={e => this.handleChange(e)} />
<button>Add</button>
</form>
<Hello name={this.text} />
</div>
);
}
}
而Hello.js组件是
export default ({ name }) => <h1>Hello {name}!</h1>;
答案 0 :(得分:2)
您的代码有2个问题。首先,您需要在构造函数中使用state
。其次,您需要使用React提供的setState
来设置状态。
import ReactDOM from "react-dom";
import React, { Component } from "react";
import Hello from "./hello";
class Test extends Component {
constructor(props) {
super(props);
// This is how you set state
this.state = {
text:''
}
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
// This is how you update state
this.setState({text: e.target.value})
console.log(this.text);
}
render() {
return (
<div>
<h1>Test</h1>
<form>
<input value={this.state.text} onChange={e => this.handleChange(e)} />
<button>Add</button>
</form>
<Hello name={this.state.text} />
</div>
);
}
}
Here是一个文档,您可以在其中阅读更多信息。
答案 1 :(得分:1)
这里您要修改实例字段(this.text
),而不是使用setState()
设置状态。
例如您的代码,简化了:
import React, { Component } from "react";
class App extends Component {
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.state = { text: "" };
}
handleChange(e) {
this.setState({text:e.target.value});
}
render() {
return (
<div>
<h1>Test</h1>
<form>
<input value={this.state.text} onChange={e => this.handleChange(e)} />
<button>Add</button>
</form>
{this.state.text}
</div>
);
}
}
export default App;
答案 2 :(得分:0)
您需要使用setState
而不是将值设置为本地变量。渲染自动遵循setState。
class App extends React.Component {
constructor(props) {
super(props);
// Add state to the constructor
this.state = { text: '' };
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
// Set the value to the state text property
this.setState({ text: e.target.value });
}
// Use `this.state.text` instead of this.text
render() {
return (
<div>
<h1>Test</h1>
<form>
<input value={this.state.text} onChange={this.handleChange} />
<button>Add</button>
</form>
<Hello name={this.state.text} />
</div>
);
}
}
function Hello({ name }) {
return <h1>Hello {name}!</h1>;
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>
答案 3 :(得分:0)
这可以通过在组件上设置状态来处理。您需要在测试组件中对此进行修复。
设置文本值this.setState({ text: '' })
获取文本值this.state.text
使用this.handleChange = this.handleChange.bind(this)
的原因是在handleChange中访问this.setState
。
在React中详细了解state。
import React, { Component } from "react";
import Hello from "./Hello";
class Test extends Component {
constructor(props) {
super(props);
this.state = {
text: ''
}
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.setState({
text: e.target.value
});
}
render() {
return (
<div>
<h1>Test</h1>
<form>
<input value={this.state.text} onChange={e => this.handleChange(e)} />
<button>Add</button>
</form>
<Hello name={this.state.text} />
</div>
);
}
}
export default Test;