使用react在修改state中的數(shù)組和對象數(shù)據(jù)的時候(setState)
react修改state的數(shù)組和對象數(shù)據(jù)的時候(setState)
首先在修改狀態(tài)數(shù)據(jù)(state)的時候,我們要遵循react的規(guī)則,使用setState()方法去修改
此時修改的數(shù)據(jù)是一個數(shù)組或者是一個對象的時候,setState中傳遞一個對象是不能夠滿足的,此時就需要給setState中傳遞函數(shù)了!
此時函數(shù)中的參數(shù)state就是我們組件中的state數(shù)據(jù),可以在方法中把參數(shù)中state改變后通過k:v return出來
handlerWorkType(item, index) { this.setState((state) => { for(let i = 0; i < state.submitWorksList.length; i++) { if(state.submitWorksList[i] == item.id) { state.submitWorksList.splice(i, 1) state.worksTypeList[index].activeShow = false return { submitWorksList: state.submitWorksList, worksTypeList: state.worksTypeList } } } state.submitWorksList.push(item.id) state.worksTypeList[index].activeShow = true return { submitWorksList: state.submitWorksList, worksTypeList: state.worksTypeList } }) }
需要注意
必須要在數(shù)據(jù)修改之后在通過k:v對return;
避免調(diào)用其它方法,將其它方法的返回值賦值給我們的變量;得不償失!
react修改數(shù)組對象的注意事項(xiàng)
react開發(fā)主張使用函數(shù)式編程,函數(shù)式編程有個重要的特性就是不可變性。 你無法更改數(shù)據(jù),也不能更改。 如果要改變或更改數(shù)據(jù),則必須復(fù)制數(shù)據(jù)副本來更改。
看個例子,就是Vue和React兩個框架實(shí)現(xiàn)給數(shù)組添加一個元素。
vue
export default { ?? ?name: "home", ?? ?data() { ?? ??? ?return { ?? ??? ??? ?testArr: ['蘋果','香蕉'] ?? ??? ?}; ? ? }, ? ? created(){ ? ? ? ? this.testArr.push('橘子') ? ? } }; ...
react
class App extends React.Component { ? ? constructor(props) { ? ? ? ? super(props); ? ? ? ? this.state = { ? ? ? ? ? ? testArr: ['蘋果','香蕉'] ? ? ? ? }; ? ? } ? ? componentDidMount(){ ? ? ? ? this.setState({ ? ? ? ? ? ? testArr:[...this.state.testArr,'橘子'] ? ? ? ? }) ? ? } ? ? render(){ ? ? ? ? return ( ? ? ? ? ? ? <React.Fragment> ? ? ? ? ? ? ? ? <p>{this.state.testArr}</p> ? ? ? ? ? ? </React.Fragment> ? ? ? ? ) ? ? } }
這里會發(fā)現(xiàn)兩個框架有個細(xì)微差別,Vue是直接修改的原數(shù)組,而React是不修改原數(shù)組,而是創(chuàng)建了一份新的數(shù)組,再通過setState賦值。剛接觸React的時候的確會覺得挺奇怪,感覺會無形增加代碼復(fù)雜度。接下來看下為何React要如此設(shè)計(jì)。
React遵循函數(shù)式編程規(guī)范。在函數(shù)式編程中,不推薦直接修改原始數(shù)據(jù)。 如果要改變或更改數(shù)據(jù),則必須復(fù)制數(shù)據(jù)副本來更改。所以,函數(shù)式編程中總是生成原始數(shù)據(jù)的轉(zhuǎn)換副本,而不是直接更改原始數(shù)據(jù)。
這里是一些常見的React修改數(shù)組或者對象的例子,所有這些函數(shù)都不改變現(xiàn)有的數(shù)據(jù),而是返回新的數(shù)組或?qū)ο蟆?/p>
刪除數(shù)組中的指定元素
//刪除testArr中的櫻桃 ... constructor(props) { ? ? super(props); ? ? this.state = { ? ? ? ? testArr: ['蘋果','香蕉','橘子','櫻桃','橙子'] ? ? }; } componentDidMount(){ ? ? this.setState({ ? ? ? ? testArr:this.state.testArr.filter(res=>res!=='櫻桃') ? ? }) } ...
合并兩個對象
... constructor(props) { ? ? super(props); ? ? this.state = { ? ? ? ? testObj1:{ ? ? ? ? ? ? chineseName:'橘子', ? ? ? ? ? ? englishName:'orange' ? ? ? ? }, ? ? ? ? testObj2:{ ? ? ? ? ? ? color:'yellow', ? ? ? ? ? ? shape:'circle' ? ? ? ? }, ? ? ? ? testObj:{} ? ? }; } componentDidMount() { ? ? this.setState({ ? ? ? ? testObj: Object.assign(this.state.testObj1,this.state.testObj2) ? ? }) } ...
修改多層級對象的值
//testObj的apple的color改成green ... constructor(props) { ? ? super(props); ? ? this.state = { ? ? ? ? testObj: { ? ? ? ? ? ? banner: { ? ? ? ? ? ? ? ? name: '香蕉', ? ? ? ? ? ? ? ? color: 'yellow' ? ? ? ? ? ? }, ? ? ? ? ? ? apple: { ? ? ? ? ? ? ? ? name: '蘋果', ? ? ? ? ? ? ? ? color: 'red' ? ? ? ? ? ? } ? ? ? ? } ? ? }; } componentDidMount() { ? ? this.setState({ ? ? ? ? testObj: { ? ? ? ? ? ? ...this.state.testObj, ? ? ? ? ? ? apple:{ ? ? ? ? ? ? ? ? ...this.state.testObj.apple, ? ? ? ? ? ? ? ? color:'green' ? ? ? ? ? ? } ? ? ? ? } ? ? }) } ...
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
React?Hook?Form?優(yōu)雅處理表單使用指南
這篇文章主要為大家介紹了React?Hook?Form?優(yōu)雅處理表單使用指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03react中form.setFieldvalue數(shù)據(jù)回填時 value和text不對應(yīng)的問題及解決方法
這篇文章主要介紹了react中form.setFieldvalue數(shù)據(jù)回填時 value和text不對應(yīng)的問題及解決方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07基于React的狀態(tài)管理實(shí)現(xiàn)一個簡單的顏色轉(zhuǎn)換器
這篇文章主要介紹了用React的狀態(tài)管理,簡簡單單實(shí)現(xiàn)一個顏色轉(zhuǎn)換器,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價值,需要的朋友可以參考下2023-08-08react項(xiàng)目從新建到部署的實(shí)現(xiàn)示例
這篇文章主要介紹了react項(xiàng)目從新建到部署的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02React實(shí)現(xiàn)浮層組件的思路與方法詳解
React?浮層組件(也稱為彈出組件或彈窗組件)通常是指在用戶界面上浮動顯示的組件,本文主要介紹了浮層組件的實(shí)現(xiàn)方法,感興趣的小伙伴可以了解下2024-02-02React實(shí)現(xiàn)模糊搜索和關(guān)鍵字高亮的示例代碼
這篇文章主要為大家詳細(xì)介紹了React如何實(shí)現(xiàn)模糊搜索和關(guān)鍵字高亮的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11React實(shí)現(xiàn)表單提交防抖功能的示例代碼
在 React 應(yīng)用中,防抖(Debounce)技術(shù)可以有效地限制函數(shù)在短時間內(nèi)的頻繁調(diào)用,下面我們就來看看如何使用Lodash庫中的debounce函數(shù)實(shí)現(xiàn)React表單提交中實(shí)現(xiàn)防抖功能吧2024-01-01淺談react?16.8版本新特性以及對react開發(fā)的影響
本文主要介紹了react?16.8版本新特性以及對react開發(fā)的影響,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03