最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React數(shù)據(jù)傳遞之組件內(nèi)部通信的方法

 更新時間:2017年12月31日 09:23:46   作者:劉小光  
這篇文章主要介紹了React數(shù)據(jù)傳遞之組件內(nèi)部通信的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1. 概述

脫離初級前端一段時間后會發(fā)現(xiàn),寫樣式的時間越來越少,處理數(shù)據(jù)的時間越來越多。處理數(shù)據(jù)的過程也就是實現(xiàn)業(yè)務(wù)邏輯的過程,這在項目中無疑是最重要的。

所以學(xué)習(xí)前端框架,了解完基本語法后,接下來就要學(xué)習(xí)其如何進行數(shù)據(jù)傳遞。

Angular 設(shè)計之初的一大亮點就是實現(xiàn)了數(shù)據(jù)的雙向綁定,使用 Vue 一段時間后發(fā)現(xiàn),所謂數(shù)據(jù)的雙向綁定,組件內(nèi)部唯一的應(yīng)用場景就是 form 表單(input,textarea,select, radio),而這種場景下的數(shù)據(jù)雙向綁定,即便框架內(nèi)部沒有實現(xiàn),自己實現(xiàn)起來也非常簡單。明白這一點后感覺之前認(rèn)為 React 沒有實現(xiàn)數(shù)據(jù)雙向綁定很 low 的想法很幼稚。

對于 React 的數(shù)據(jù)傳遞,涉及兩方面的內(nèi)容:

  1. 組件內(nèi)部的數(shù)據(jù)傳遞,典型的應(yīng)用場景包括如何實現(xiàn) form 表單雙向數(shù)據(jù)綁定、如何綁定事件;
  2. 組件間的數(shù)據(jù)傳遞。 包括父組件往子組件傳遞數(shù)據(jù)、子組件往父組件傳遞數(shù)據(jù)以及兄弟組件之間傳遞數(shù)據(jù)。

本文先討論組件內(nèi)部的數(shù)據(jù)傳遞。

2. 組件內(nèi)部數(shù)據(jù)傳遞

React 組件內(nèi)部通信主要分為兩部分:數(shù)據(jù)展示與事件處理。

2.1 數(shù)據(jù)展示

組件內(nèi)部數(shù)據(jù)的展示和更新都是通過 state 來實現(xiàn)的,如果要使用 state 必須使用 ES6 的 class 定義組件。數(shù)據(jù)更新在雙向數(shù)據(jù)綁定部分探討,這部分僅討論展示初始化數(shù)據(jù)。

如果你熟悉 Vue,React 的 state 對象相當(dāng)于 Vue 的 data 對象

下面是一個純展示數(shù)據(jù)的示例:

class App extends Component {
 constructor(props) {
 super(props);

 // 初始化 state
 this.state = {
  inputValue: "test",
 };
 }

 render() {
 // 注意,在 react 中,DOM 元素是對象,所以使用‘()'包住 
 return (
  <div className="App">
  <p>{this.state.inputValue}</p>
  </div>
 );
 }
}

在通過 class 定義的 React 組件中,除了生命周期鉤子函數(shù), constructor() 和 render() 著兩個方法也是自動執(zhí)行的,先執(zhí)行 constructor() ,執(zhí)行 constructor() 的同時也是再為 render() 渲染 DOM 做數(shù)據(jù)準(zhǔn)備。

實際上 constructor() 函數(shù)是組件生命周期中調(diào)用的第一個函數(shù)。

2.2 事件

2.2.1 與 DOM 中事件的異同

在 React 中處理事件和在 DOM 中處理事件類似,有兩點不同:

  1. React 中通過駝峰命名法命名事件,而不是全是小寫字母;
  2. 在 JSX 中直接傳遞函數(shù)作為事件處理程序,而不是字符串。

第 2 點不同有坑,后面細(xì)說

舉個例子,HTML中的事件:

<button onclick="activateLasers()">
 Activate Lasers
</button>

React 中的事件:

// 因為 jsx 中'{}'里面代表函數(shù)表達式,
// 所以傳遞給 onClick 的實際是函數(shù) activateLasers 的函數(shù)體部分,
// 因此需要指定 this 指向,不然會報錯
<button onClick={activateLasers}>
 Activate Lasers
</button>

2.2.2 存在的坑

直接傳遞 function 作為 event handler 需要指定函數(shù)的執(zhí)行環(huán)境,即需要手動綁定 this ,不然會報 this 為 undefined 的錯。見下面的例子:

class App extends Component {
 constructor(props) {
 super(props);
 this.state = {
  isToggleOn: true,
 };

 // 手動綁定 this
 this.handleClick = this.handleClick.bind(this);
 }

 handleClick() {
 // 如果不在 constructor() 方法中手動綁定 this,直接將其作為事件處理程序 this 為 undefined
 console.log(this);

 this.setState(prevState => ({
  isToggleOn: !prevState.isToggleOn
 }));
 }

 render() {
 return (
  <div className="App">
  <button onClick={this.handleClick}>
   {this.state.isToggleOn ? "on" : "off"}
  </button>
  </div>
 );
 }
}

2.2.3 為什么會有坑

React 官網(wǎng) 說這個鍋要 JS 原生語法來背,其實不盡然,React 實在 JS 語法早已確定的情況下設(shè)計了這樣的事件系統(tǒng),如果一定要有人站出來背鍋,他們五五分吧。

1, JS原生語法存在的問題

JS語法中有這樣的規(guī)則:如果將一個函數(shù)的函數(shù)體(沒有 () )賦值給另一個變量,函數(shù)體內(nèi)部的 this 指向可能會發(fā)生變化。會不會變化取決于函數(shù)和被賦值的變量是否處于同一個作用域(相同的執(zhí)行環(huán)境)中,但實際使用中,將一個函數(shù)賦值給相同作用域的變量沒有意義,那樣的話直接使用那個函數(shù)就好,沒必要在賦值給另一個變量。

this 指向不發(fā)生改變的沒有意義的例子(為了方便說明,直接使用 var 操作符):

var fn = function () {
 console.log(this);
};

var a = fn;

fn(); // window
a(); // window
this 指向發(fā)生改變的例子:

var fn = function () {
 console.log(this);
};

// 將函數(shù)體賦值給一個對象的屬性,函數(shù)執(zhí)行時 this 和定義時指向不同
var o = {
 a: fn,
};

fn(); // window
o.a(); // o,即{a:f}

如果想要在將函數(shù)體賦值另一個變量的同時把原函數(shù)的 this 指向也一塊賦值過去,就需要在賦值的過程中進行綁定 this 的操作,如下:

var fn = function () {
 console.log(this);
};

// fn 在賦值的同時將內(nèi)部的 this 打包一塊賦值給了 a
var o = {
 a: fn.bind(this),
};

fn(); // window
o.a(); // window

通常在將函數(shù)體賦值給變量的時候為了避免 this 出錯,都會進行 綁定執(zhí)行環(huán)境的操作 ,典型的例子是 var bindId = document.getElementById.bind(document)

2, JSX 存在的問題

因為 JSX 中 DOM 元素也是對象,給元素的屬性賦值實際是給 DOM 元素對象的屬性賦值,見下:

const element = (
 <button onClick={this.handleClick}>click me</button>
);

等同于

const element = {
 type: 'button',
 props: {
 onClick: this.handleClick,
 children: 'click me',
 },
};


這實際就是 將函數(shù)體賦值給一個對象的屬性,函數(shù)執(zhí)行時 this 和定義時指向不同 的場景,和原生語法相同的是 this 指向發(fā)生了改變,不同的是原生 JS 中不管怎樣, this 總歸是有個指向的,而 JSX 直接 undefined 。

所以說不綁定 this 報 undefined 的錯不能全怪 JS 原生語法。

3. 雙向數(shù)據(jù)綁定

通過 state 傳遞數(shù)據(jù)加上事件處理程序便能實現(xiàn)數(shù)據(jù)的雙向綁定,其背后的思想是(以 input 為例):初始化時將 state 中預(yù)定義的 state a 賦值給 input,當(dāng) input 的 value 發(fā)生改變時,觸發(fā)事件處理程序,將改變后的 value 賦值給狀態(tài) a ,React 監(jiān)測到 state 改變時重新調(diào)用 render() 方法,即重新渲染組件,達到雙向綁定的目的。

class App extends Component {
 constructor(props) {
  super(props);
  this.state = {
   inputValue: "test",
  };
  this.changeInput = this.changeInput.bind(this);
 }

 changeInput(e) {
  // 將改變后的 input 值賦值給 inputValue,通過事件對象 $event.target.value 實現(xiàn)
  this.setState({
   inputValue: e.target.value
  });
 }

 render() {
  // input 改變時觸發(fā) changeInput
  return (
   <div className="App">
    <input value={this.state.inputValue} onChange={this.changeInput} />
    <p>{this.state.inputValue}</p>
   </div>
  );
 }
}

這里用到了事件對象,React 的事件對象和 JS 原生事件對象保持一致。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app

    詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app

    本篇文章主要介紹了詳解開發(fā)react應(yīng)用最好用的腳手架 create-react-app,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 解決React報錯Invalid hook call

    解決React報錯Invalid hook call

    這篇文章主要為大家介紹了React報錯Invalid hook call解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 淺談React原生APP更新

    淺談React原生APP更新

    當(dāng)一個APP在運行的時候, 開發(fā)者想要將自己的代碼更新到用戶的手機上時, 一般都有兩種方案, 一是熱更新, 二就是APP更新.熱更新暫且不說,這篇文章就講講 APP 如何更新。
    2021-06-06
  • React commit源碼分析詳解

    React commit源碼分析詳解

    前兩章講到了,react 在 render 階段的 completeUnitWork 執(zhí)行完畢后,就執(zhí)行 commitRoot 進入到了 commit 階段,本章將講解 commit 階段執(zhí)行過程源碼
    2022-11-11
  • 詳解React 條件渲染

    詳解React 條件渲染

    這篇文章主要介紹了React 條件渲染的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • React純前端模擬實現(xiàn)登錄鑒權(quán)

    React純前端模擬實現(xiàn)登錄鑒權(quán)

    這篇文章主要為大家詳細(xì)介紹了React純前端模擬實現(xiàn)登錄鑒權(quán)的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • React中組件間數(shù)據(jù)共享的多種方案

    React中組件間數(shù)據(jù)共享的多種方案

    在現(xiàn)代前端開發(fā)中,React以其組件化思想為核心,極大地提升了代碼的可復(fù)用性和可維護性,隨著應(yīng)用復(fù)雜度的提升,一個不可避免的問題浮出水面:如何在不同組件間高效、清晰、可預(yù)測地共享數(shù)據(jù),本文將全面、深入地探討React中組件間數(shù)據(jù)通信的各種方法
    2025-09-09
  • 詳解React路由傳參方法匯總記錄

    詳解React路由傳參方法匯總記錄

    這篇文章主要介紹了詳解React路由傳參方法匯總記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • react?native?reanimated實現(xiàn)動畫示例詳解

    react?native?reanimated實現(xiàn)動畫示例詳解

    這篇文章主要為大家介紹了react?native?reanimated實現(xiàn)動畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • React 首頁加載慢問題性能優(yōu)化案例詳解

    React 首頁加載慢問題性能優(yōu)化案例詳解

    這篇文章主要介紹了React 首頁加載慢問題性能優(yōu)化案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論

武清区| 湄潭县| 万宁市| 青川县| 出国| 武义县| 阳西县| 长武县| 马关县| 应用必备| 石柱| 句容市| 新河县| 静乐县| 盐城市| 泾川县| 双牌县| 海城市| 洱源县| 商水县| 乳源| 巩留县| 富平县| 新建县| 札达县| 美姑县| 阿拉善盟| 临沧市| 桐柏县| 青龙| 昌图县| 祁东县| 喀什市| 诸暨市| 渭南市| 大同县| 凤翔县| 安平县| 雅安市| 中宁县| 吴桥县|