[英]React not re-render when child component updated
我试图让 SigninForm 将 email 传递回调用它的组件(App)。 然后当 email 更新时,应用程序应该重新渲染。 我试图创建前面问题中给出的结构。 但是,我无法让 App 组件在我的 React 代码中更新和显示 email。
TLDR:当我单击按钮时,为什么 Email 没有显示在片段上?
function App() { const [email, setEmail] = React.useState(); return ( <div> EMAIL: {email} <br></br> <SigninForm setEmail={setEmail}/> </div> ) } function SigninForm() { const [email, setEmail] = React.useState() var credsSubmit = (event) => { event.preventDefault(); setEmail('me@me.com') } return ( <div> <form onSubmit={credsSubmit}> <input type='submit' /> </form> </div> ) } ReactDOM.render(<App />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> <div id="root"></div>
function App() { const [email, setEmail] = React.useState(); return ( <div> EMAIL: {email} <br></br> <SigninForm setEmail={setEmail}/> </div> ) } function SigninForm(props) { const [email, setEmail] = React.useState() var credsSubmit = (event) => { event.preventDefault(); props.setEmail('me@me.com') } return ( <div> <form onSubmit={credsSubmit}> <input type='submit' /> </form> </div> ) } ReactDOM.render(<App />, document.getElementById('root'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script> <div id="root"></div>
1-在App
组件中,您将setEmail
作为道具传递给SigninForm
这一行:
<SigninForm setEmail={setEmail}/>
2-在SigninForm
中,您正在创建一个 state 变量email
和一个设置器 function 来设置它的值setEmail
即这一行:
const [email, setEmail] = React.useState()
在SigninForm
中,您调用setEmail
认为这将更新App
组件的 state ,而实际上您调用的是本地setEmail
而不是您从道具收到的那个。
通过调用props.setEmail
您正在调用来自App
组件而不是本地组件的方法。
这是关于组件和道具的反应指南
function App() {
const [email, setEmail] = React.useState();
return (
<div>
EMAIL: {email}
<br></br>
<SigninForm setEmail={setEmail}/>
</div>
)
}
function SigninForm(props) {
var credsSubmit = (event) => {
event.preventDefault();
props.setEmail('me@me.com') // changed this and removed local email state
}
return (
<div>
<form onSubmit={credsSubmit}>
<input type='submit' />
</form>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'));
你试过按钮吗?
function App() {
const [email, setEmail] = React.useState();
return (
<div>
EMAIL: {email}
<br></br>
<SigninForm setEmail={setEmail}/>
</div>
)
}
function SigninForm() {
const [email, setEmail] = React.useState()
var credsSubmit = (event, data) => {
event.preventDefault();
props.setEmail(data.email.toLowerCase());
}
return (
<div>
<form onSubmit={credsSubmit}>
<input name="email" />
<button type="submit">Submit</button>
</form>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.