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

有沒有更好的解決方法?答案是有的,這就涉及到了子組件state的重置與保留。
一、state保留
當(dāng)在父組件中引入一個(gè)子組件,就會(huì)在對(duì)應(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的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ReactNative 之FlatList使用及踩坑封裝總結(jié)
本篇文章主要介紹了ReactNative 之FlatList使用及踩坑封裝總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11
React Router 中實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由的示例
React Router 是一個(gè)非常強(qiáng)大和靈活的路由庫(kù),它為 React 應(yīng)用程序提供了豐富的導(dǎo)航和 URL 管理功能,能夠幫助我們構(gòu)建復(fù)雜的單頁(yè)應(yīng)用和多頁(yè)應(yīng)用,這篇文章主要介紹了React Router 中如何實(shí)現(xiàn)嵌套路由和動(dòng)態(tài)路由,需要的朋友可以參考下2023-05-05
詳解React如何優(yōu)雅地根據(jù)prop更新state值
這篇文章主要為大家詳細(xì)介紹了React如何優(yōu)雅地實(shí)現(xiàn)根據(jù)prop更新state值,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以了解下2023-11-11
React自定義視頻全屏按鈕實(shí)現(xiàn)全屏功能
這篇文章主要介紹了React自定義視頻全屏按鈕實(shí)現(xiàn)全屏功能,通過繪制全屏按鈕,并綁定點(diǎn)擊事件,編寫點(diǎn)擊事件,通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-11-11
React利用scheduler思想實(shí)現(xiàn)任務(wù)的打斷與恢復(fù)
這篇文章主要為大家詳細(xì)介紹了React如何利用scheduler思想實(shí)現(xiàn)任務(wù)的打斷與恢復(fù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2024-03-03
react 路由跳轉(zhuǎn)的7種方式實(shí)現(xiàn)
本文介紹了React中六種常見的路由跳轉(zhuǎn)方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03

