亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 concat 與直接賦值時 setState 有什么區別嗎?

使用 concat 與直接賦值時 setState 有什么區別嗎?

滄海一幻覺 2021-12-12 10:34:53
import React, { Component } from "react";import axios from "axios";import ReactPlayer from "react-player";export default class DoctorData extends Component {  state = {    sidebarOpen: true,    courseData: [],    renderData: []  };  componentDidMount() {    let jwtToken = { accessToken: "" };    axios.post(" ", jwtToken).then(data => {      console.log(data);      this.setState({        courseData: data.data.courseDetails.userModuleDetailsV2      });    });  }  RenderComponent = () => {    console.log("we are inside sideBarComponet");    return (      <div className="card">        {this.state.courseData.map((value, key) => {          console.log(value);          console.log("we are inside key", key);          //   console.log(value.userLessonDetails[key].userChapterDetails[0].chapter.content)          return (            <div>              <div className="card-header">                <h4>Doctor-content</h4>                <ReactPlayer                  url={                    value.userLessonDetails[0].userChapterDetails[0].chapter                      .content                  }                  playing                />                {console.log(                  "we are printing the content",                  value.userLessonDetails[0].userChapterDetails[0].chapter                    .content                )}                {console.log(typeof this.state.courseData)}              </div>            </div>          );        })}      </div>    );  };  render() {    return (      <div>        {this.state.courseData.length ? (          <div>{this.RenderComponent()}</div>        ) : null}        {console.log("fghjkl", this.state.courseData)}        {this.state.courseData.length}      </div>    );  }}
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

.concat()

該concat()方法用于合并兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組。


這證實在狀態的不可變更新中使用是安全的。


請注意,對于作為參數傳遞的任何值,它的工作原理相同,但有點扁平化數組。


該concat方法創建一個新數組,該數組由調用它的對象中的元素組成,對于每個參數,按順序依次是該參數的元素(如果該參數是一個數組)或該參數本身(如果該參數是不是數組)。它不會遞歸到嵌套數組參數中。


[1].concat(['test'])   //=> [1, "test"]

[1].concat('test')     //=> [1, "test"]

[1].concat([['test']]) //=> [1, ["test"]]

.concat創建一個包含舊this.state.courseData值和接收到的新值的新數組。由于初始狀態是一個空數組[],除非data.data.courseDetails.userModuleDetailsV2不是數組,否則兩者結果相同。


this.state.courseData.concat(data.data.courseDetails.userModuleDetailsV2)

相當于


[].concat(newValues)

// or just

newValues // if array

[newValues] // if something else

所以兩者都是相同的,但.concat在這里是不必要的,因為它只會在內部調用一次,componentDidMount 除非 this.state.courseData預先填充了來自 props 或其他地方的默認數據。


刪除時不起作用.concat?

這意味著它data.data.courseDetails.userModuleDetailsV2可能不是一個數組,并且您期望在 render 方法中有一個數組,但是當 axios 調用成功時(以及在 之后setState),它不再是數組了。


this.setState({

  courseData: this.state.courseData.concat(

    data.data.courseDetails.userModuleDetailsV2

  )

})

//=> [data.data.courseDetails.userModuleDetailsV2]


this.setState({

  courseData: data.data.courseDetails.userModuleDetailsV2

})

//=> data.data.courseDetails.userModuleDetailsV2

話雖.concat如此,如果您要添加“獲取更多”功能,那么使用它可能會很有用。


onFetchMore = (offset) => {

  fetchMoreAxiosCall(offset)

    .then(newData => this.setState(({ courseData }) => ({ 

      courseData: courseData.concat(newData)

    })))

}

您可以只更新狀態內所需的值,而無需傳播舊狀態 ( { ...state, courseData: /**/ }) 因為 ( source ):


更新器的輸出與狀態淺合并。


查看完整回答
反對 回復 2021-12-12
?
米脂

TA貢獻1836條經驗 獲得超3個贊

相反,ReactpreviousState通過傳遞一個接受先前狀態作為第一個參數的函數來提供,例如



// general

this.setState((oldState) => ({ ...oldState }));


// useful for updating objects

this.setState(({ myObject }) => ({ 

    myObject: { ...myObject, propToUpdate: true }

  })

);


查看完整回答
反對 回復 2021-12-12
  • 2 回答
  • 0 關注
  • 419 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號