摘要:而主要被設計用于維持組件內部私有狀態。初始化初始化需要在中進行。對于的定義為請求修改某個數據,而的實現則是將對變量的修改放入一個修改隊列中,在一個循環之后進行批量更新結果深入點涉及的更新機制。推出了與版本之后推出來的就是為了解決這些問題的。
3.1 什么是state
我們要認識到,React中的組件其實是一個函數,所以state是函數內部的私有變量,外部其他組件或者方法都是無法直接訪問到內部的state。
而state主要被設計用于維持組件內部私有狀態。
初始化state需要在class中constructor進行。
import React, { PureComponent } from "react" export default class index extends PureComponent { constructor(props){ super(props) this.state = {name:"demo react",time:new Date()} } render() { return (Hello world React!{this.state.name}) } }組件生成時間:{this.state.time}
在這個代碼中,我們初始化了name,time兩個state值。一旦state初始化完成,我們就可以在render中進行訪問。
使用npm run dev命令運行,并在瀏覽器中打開查看吧。
我們已經知道了如何初始化組件中的state值,那么接下來我們來看看,如何實現修改state的值
import React, { PureComponent } from "react" export default class index extends PureComponent { constructor(props){ super(props) this.state = {name:"demo react",time:+new Date()} } handleUpdateName () { this.state.time = (+new Date()) } render() { return (Hello world React!{this.state.name}) } }組件生成時間:{this.state.time}
有些動作快的同學,第一個想法就是如此修改組件中的state值,但是值得玩味的是,值的確是修改成功了,但是,并沒有實時體現在界面上。這究竟是怎么回事呢?
這就要來看看,React中的setState方法。
React對于setState的定義為請求React修改某個數據,而React的實現則是將對變量的修改放入一個修改隊列中,在一個循環之后進行批量更新結果(深入點涉及VDom的更新機制)。所以,這里會造成一個問題,就是setState數據之后立刻進行讀取,可能你讀取到的數據,并非是已經被更新過的有效值。
setState有三種修改數據的方式,讓我們來一個一個嘗試。
import React, { PureComponent } from "react" export default class index extends PureComponent { constructor(props){ super(props) this.state = {name:"demo react",time:+new Date()} } handleUpdateName () { // this.state.time = (+new Date()) console.log("修改前的值",this.state.time) this.setState({time:+new Date()}) console.log("修改后的值",this.state.time) let that = this setTimeout(function(){ console.log("當前state值",that.state.time) }) } render() { return (Hello world React!{this.state.name}) } }組件生成時間:{this.state.time}
點擊按鈕,控制臺輸出了不同的值,可以觀察到setState是采用異步隊列模式的。
現在出現了一個問題,如果我們需要通過等待setState修改完成的值之后,應該如何處理?React為我們的setState提供了第二個參數callback。
import React, { PureComponent } from "react" export default class index extends PureComponent { constructor(props){ super(props) this.state = {name:"demo react",time:+new Date()} } handleUpdateName () { // this.state.time = (+new Date()) console.log("修改前的值",this.state.time) this.setState({time:+new Date()},(function(){ console.log("當前state值",that.state.time) }) console.log("修改后的值",this.state.time) } render() { return (Hello world React!{this.state.name}) } }組件生成時間:{this.state.time}
再次運行,并且點擊按鈕。我們可以看到控制臺輸出的值是跟第一個方法是一致的。
現在我們來進行一次腦暴,可不可以直接修改state值呢?因為我們在最早直接對state修改的時候,React并未關閉這個對象的set方法。那么我們可否直接通過修改state來進行渲染呢?React中的一個方法為我們解決了這個疑問。
import React, { PureComponent } from "react" export default class index extends PureComponent { constructor(props){ super(props) this.state = {name:"demo react",time:+new Date()} } handleUpdateName () { console.log("修改前的值", this.state.time); this.state.time = (+new Date()) console.log("修改后的值", this.state.time); console.log("當前state值", this.state.time); this.forceUpdate() } render() { return (Hello world React!{this.state.name}) } }組件生成時間:{this.state.time}
上面這個代碼僅僅用于腦暴,參考,不要在生產環境中使用,因為這個會造成React渲染算法與各種Hook失效,造成全局重新渲染。
在某些場景下面,我們可能是新的值是基于上一次的值推算而來,所以React提供了setState傳遞進方法來進行推算處理。
import React, { PureComponent } from "react"; export default class index extends PureComponent { constructor(props) { super(props); this.state = { name: "demo react", time: +new Date() }; } handleUpdateName() { console.log("修改前的值", this.state.time); let that = this; this.setState(oldData => { return { time: oldData.time + 1000 }; }); console.log("修改后的值", this.state.time); setTimeout(function() { console.log("當前state值", that.state.time); }); } render() { return (Hello world React!{this.state.name}); } }組件生成時間:{this.state.time}
最后說一點,就是setState是淺拷貝,如果是結構比較深層的對象,很多同學會采用JSON.string()這種來進行深拷貝,這樣的操作雖然說是可以的,但是非常影響性能。
React推出了immutable與15版本之后推出來的PureComponent就是為了解決這些問題的。有興趣的同學可以搜索一下相關資料進行拓展閱讀。
3.2 什么是props我們知道,在函數中有帶參數的方法,那么props其實就是傳入方法中的參數。并且在React中props是只讀屬性。在使用場景上,是由父組件向子組件傳遞值的時候使用的。
我們首先創建一個可以接收props值的組件。
import React, { PureComponent } from "react"; export default class index extends PureComponent { constructor(props) { super(props); } render() { return ({this.props.value||"暫無數據"}); } }
接著,我們修改Index.js引用這個組件。
import React, { PureComponent } from "react"; import Content from "./content.js" export default class index extends PureComponent { constructor(props) { super(props); this.state = { name: "demo react", time: +new Date() }; } handleUpdateName() { this.setState({time:+new Date()}) } render() { return (Hello world React!{this.state.name}); } }組件生成時間:{this.state.time}
這里大家有一點要注意,在React中,所有的組件名稱第一個字母都必須大寫,這是為了與html標簽區分出來。
如何向子組件傳值呢?就像給html標簽增加屬性一樣。
這樣,組件內部可以通過props讀取到value值了。不過React的組件傳遞中有一個很有趣的屬性children,這個的用處傳遞組件包含的內容。
繼續修改引入組件的代碼,如下
// index.js主體Children
import React, { PureComponent } from "react"; export default class index extends PureComponent { constructor(props) { super(props); } render() { return ({this.props.value||"暫無數據"},children:{this.props.children}); } }
最終顯示效果就是這樣的
原文地址:https://www.yodfz.com/detail/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100908.html
摘要:原文地址是一個庫,主要是通過操作數據的方式去操縱,為什么要重造輪子呢,因為覺的目前市面上的框架對于創建大型應用程序不夠直觀,不能滿足需求,所以誕生了。其實說它性能高,只不過是用的方式計算出最小的操作,所以性能就上來了。 原文地址:https://gmiam.com/post/react-... React 是一個 JS 庫,主要是通過操作數據的方式去操縱 DOM,為什么要重造輪子呢,因...
摘要:本篇講解雙源屬性不可變數據事件驅動等。可被偵聽,被偵聽后源頭若發生變化,相應的偵聽函數將自動被調起。本文完本專欄歷史文章介紹一項讓可以與抗衡的技術可視化開發工具非正經入門之一三宗罪可視化開發工具非正經入門之二分離界面設計 本系列博文從 Shadow Widget 作者的視角,解釋該框架的設計要點。本篇講解雙源屬性、不可變數據、事件驅動等。 showImg(https://segment...
摘要:在構造函數里面初始化的數據,把數據放在頁面上,點擊時候調用方法改變中的數據。是中父組件向子組件通信的方式,下面是一個簡單的例子使用組件我是顯示的數據我們定義組件時候在構造函數中可以接收到參數,并且要使用傳到的構造方法中。 React的學習之路還要繼續走下去,最近一邊在做未完成的項目一邊學習React,項目是vue寫的,后面還需要有一個后臺管理系統計劃使用react完成,寒假說長也不長,...
摘要:讓他增加一個內部維持的狀態另外有一點需要注意,由于是無狀態組件,所以,無論是否變更,都會重新刷新這個組件。 4.1 什么是無狀態組件 在開發React組件的時候,大家可能會遇到就是我使用的這個組件純粹就是渲染使用,里面并沒有自己的狀態、方法、生命周期等等操作。 而為這種組件創建完整的實例有一種浪費機器性能的感覺。 那么,讓我們來看看,如何創建一個easy react component...
0x000 概述 上一章說明了生命周期的概念,本質上就是框架在操作組件的過程中暴露出來的一系列鉤子,我們可以選擇我們需要的鉤子,完成我們自己的業務,以下講的是react v16.3以下的生命周期,v16.3以及以上的版本有所不同 0x001 組件掛載 以下是組件掛載的過程中觸發的聲明周期: class App extends React.Component { constructor(pr...
閱讀 3473·2023-04-26 02:48
閱讀 1468·2021-10-11 10:57
閱讀 2493·2021-09-23 11:35
閱讀 1201·2021-09-06 15:02
閱讀 3300·2019-08-30 15:54
閱讀 1617·2019-08-30 15:44
閱讀 883·2019-08-30 15:44
閱讀 992·2019-08-30 12:52