React?保留和重置State
前言
在開發(fā)時(shí),我們復(fù)用一個(gè)組件,比如說切換不同的聊天窗口,這個(gè)窗口是公用的組件<Chat/>聊天窗口、<ContactList/>組件,控制不同人的id去切換不同的窗口和一個(gè)父組件<Messenger/>,
<Chat/>包含的state值:text。
import { useState } from 'react';
export default function Chat({ contact }) {
const [text, setText] = useState('');
return (
<section className="chat">
<textarea
value={text}
placeholder={'Chat to ' + contact.name}
onChange={e => setText(e.target.value)}
/>
<br />
<button>Send to {contact.email}</button>
</section>
);
}
<ContactList/>觸發(fā)setTo改變To的值。
export default function ContactList({
selectedContact,
contacts,
onSelect
}) {
return (
<section className="contact-list">
<ul>
{contacts.map(contact =>
<li key={contact.id}>
<button onClick={() => {
// 調(diào)用setTo改變To的值
onSelect(contact);
}}>
{contact.name}
</button>
</li>
)}
</ul>
</section>
);
}
<Messenger/>管理state值:To。


當(dāng)我們在側(cè)邊欄切換不同的tab的時(shí)候,里面輸入的內(nèi)容沒有重置。
因?yàn)榻M件的JSX位置不變,且state是獨(dú)立的,每次傳遞新的props值to,即使會(huì)重新渲染,但并不會(huì)改變子組件已有的state值。
之前我的解決方法:

有沒有更好的解決方法?答案是有的,這就涉及到了子組件state的重置與保留。
一、state保留
當(dāng)在父組件中引入一個(gè)子組件,就會(huì)在對應(yīng)的UI tree上分配到一個(gè)位置,如果這個(gè)UI tree的位置一直沒有被修改,那么它的state值也就不會(huì)發(fā)生改變。



這種說白了,只是props值改變,子組件state依舊保留。因?yàn)榻M件并沒有從觸發(fā) (存在-->消失-->出現(xiàn)) 的情況。
二、state重置
如果要讓上面的組件里state重置,就需要在其中一個(gè)組件套著任意標(biāo)簽,組件將會(huì)出 (存在-->消失-->出現(xiàn)) 的情況。



單擊復(fù)選框時(shí),計(jì)數(shù)器狀態(tài)將重置。雖然呈現(xiàn)了Counter,但該div的第一個(gè)子元素從div變?yōu)閟ection。section從DOM中移除時(shí),它下面的整個(gè)樹(包括Counter和它的狀態(tài))也會(huì)被銷毀。
添加key值是最佳重置子組件state的解決方案。
優(yōu)化前

優(yōu)化后

總結(jié)
- 只要相同的組件呈現(xiàn)在相同的
UI tree位置,React 就會(huì)保留state。 state不保存在JSX標(biāo)記中。它與放置JSX的樹位置相關(guān)聯(lián)。- 您可以通過給子樹一個(gè)不同的
key來強(qiáng)制它重置狀態(tài)。
以上就是React 保留和重置State的詳細(xì)內(nèi)容,更多關(guān)于React 保留重置State的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React Native開發(fā)封裝Toast與加載Loading組件示例
這篇文章主要介紹了React Native開發(fā)封裝Toast與加載Loading組件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
React Native實(shí)現(xiàn)地址挑選器功能
這篇文章主要為大家詳細(xì)介紹了React Native仿地址挑選器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
React項(xiàng)目打包發(fā)布到Tomcat頁面空白問題及解決
這篇文章主要介紹了React項(xiàng)目打包發(fā)布到Tomcat頁面空白問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
React實(shí)現(xiàn)控制減少useContext導(dǎo)致非必要的渲染詳解
這篇文章主要介紹了React如何有效減少使用useContext導(dǎo)致的不必要渲染,使用useContext在改變一個(gè)數(shù)據(jù)時(shí),是通過自己逐級(jí)查找對比改變的數(shù)據(jù)然后渲染,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
react.js CMS 刪除功能的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猺eact.js CMS 刪除功能的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
React循環(huán)遍歷渲染數(shù)組和對象元素方式
這篇文章主要介紹了React循環(huán)遍歷渲染數(shù)組和對象元素方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09

