[英]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.