react-React深入-一等公民-props-onChange

来源:https://www.cnblogs.com/jhzhu/archive/2020/01/17/reactreact-shen-ruyi-deng-gong-minpropsonchange.html
-Advertisement-
Play Games

title: '[react]深入 - 一等公民 props & onChange'date: 2017-08-23 10:05:07tags:reactreactjspropsonChange框架reduxcategories:技術寫在前面這篇博客的前身是 《React 新手必須知道的10件事》,... ...



title: '[react]深入 - 一等公民 props & onChange'
date: 2017-08-23 10:05:07
tags:

  • react
  • reactjs
  • props
  • onChange
  • 框架
  • redux
    categories:
  • 技術

寫在前面

這篇博客的前身是 《React 新手必須知道的10件事》,結果寫著寫著,「每件事」都遠遠超過了預計的300~500字的限制。給讀者的閱讀造成了極大的困擾。故將《10件事》拆開成若幹篇,每一篇只講一個主題。

正文

React 最推薦的數據交互方式是:props & onChnage。在這種交互方式里:對於一個可視組件 ComponentA,用 props 來向它發送信息,而用 onChange 回調函數來接收 ComponentA 發送的·信息。在程式世界里,我們更喜歡把上述「交互方式」稱為「介面」,雖然這個「介面」不是我們在面向對象語言里的 interface,但是跟 interface 有著類似的功能。 我們暫且把這個「介面規範」取名為 「props & onChange 介面規範」。

React 還是給了另外一種方法來進行數據交互:ref & method。在這種交互方式里,我們通過 <ComponentA ref={ r => this.refOfComponentA = r } 的方式來獲得 ComponentA 對象的引用,然後用 this.refOfComponentA.someMethod() 來向它發送信息。我們把這交互方式稱為 「ref & method 介面規範」。在典型的客戶端開發環境里(iOS、Android、Windows PC等),這種方式更為常見,並且對函數調用更加友好,更「像」程式語言。但是,對於 React 新手,我們強烈不建議使用這種藉口規範,除非你對 React 整個機制非常瞭解,仍然想用它。因為它嚴重破壞了 React 組件的一致性。原因有:

  1. React 的可視組件的層級結一般是在 jsx 文件中以一種類似於 html 的語言來表示的,這種表示方式既方便又直觀,表達力很強。在這種特殊的 jsx 語言里,「props & onChange介面規範」很容易且自然的被遵守。而如果用 「ref & method介面規範」,你不得不跳轉到很多行以外,才能明白信息的傳遞過程,既不利於代碼編寫,也不利於閱讀。
  2. 我們避免不了用 props 方式來進行數據傳遞。我們說「避免不了」,因為很多原因,在此僅列舉兩個:一、jsx 文件中,Html 內置元素只能通過 props 來傳遞參數;二、很多第三方庫(如果我們在開發一個大型項目,必定有很多「輪子」不用自己造),也必須通過 props 來傳遞參數。所以,props 不可避免;而同時存在兩種介面規範,是沒有意義且容易出錯的。
  3. 第三個原因可能比較「經驗化」。如果現在不能理解和認同,你聽聽就好;反正,當你使用過的優秀開源框架足夠多,你肯定會明白的:當你新接觸一個框架時,暫時拋棄自己以往的習慣,轉而遵守它的語言規範,是最好的選擇。原因很簡單:
    1. 一個框架從出生到出名,一定有自己與眾不同的框架思想,才能從其他同類型框架中脫引而出。時間的驗證,是有意義的。
    2. 過於輕率的使用其他的編程思想,會多處碰壁;也不利於你真正瞭解此框架的優勢和瓶頸。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.SQLite介紹 SQLite,是一款輕型的資料庫,它的優缺點有如下: 輕量級,適合嵌入式設備,並且本身不依賴第三方的軟體,使用它也不需要“安裝”。 併發(包括多進程和多線程)讀寫方面的性能不太理想。可能會被寫操作獨占,從而導致其它讀寫操作阻塞或出錯 2.SQLiteOpenHelper介紹 為 ...
  • 0.效果演示 插入視頻插不進來,就很煩。可以出門右拐去優酷看下(點我!)。 1.準備工作 1.1前端框架 前端使用了基於vue.js的nuxt.js。為什麼使用nuxt.js? 首先我做的是博客的項目,所以SSR至關重要。雖然跟本文要講的登錄註冊沒有什麼關係,但是文章如果用axios來非同步獲取的話, ...
  • 今天設置了Bootstrap Table的複雜表頭,設置了多級表頭(兩行列名),但是只能顯示第一級表頭(第一行的列名),第二級的表頭被第一級的表頭覆蓋。但是我仿照其他網上的其他設置複雜表頭例子都能正常顯示,我的設置了多級表頭怎麼就不能正常展示呢?我真的十分鬱悶,後經過思考和查找資料,需要在頁面加上這 ...
  • 寫著寫著,就會跑偏,沒錯又走上了一個岔道……就是不知道這條岔道以後會不會越來越寬,有的說他是未來,有的說…… 這裡不知道,也不做什麼評斷。減少一些重覆性的工作,提高開發效率這是最根本的。說白了就是偷懶唄!又說了一大堆廢話。接觸過angularjs、vue還有一點點的reactjs,組件化的思想給開發 ...
  • 文本陰影介紹 在 中使用 屬性設置文本陰影,該屬性一共有 個屬性值如:水平陰影、垂直陰影、(清晰度或模糊距離)、陰影顏色。 屬性值說明,在文本陰影實踐中:第一個值是設置陰影水平方向移動,第二個值是設置陰影垂直方向移動,第三個值是設置陰影模糊距離,第四個值是設置陰影顏色。 屬性值可以設置為負數。 文本 ...
  • 音樂導航 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> * { margin: 0; padding: 0; list-style: none; } .nav { ...
  • 背景: 項目基於原生js,沒用到任何腳手架和框架,但也需要打包壓縮。 項目的js中聲明瞭一些全局變數 供其他js調用。 這時候如果用webpack打包,基於webpack特性,會嵌套一層大函數,會將js中的變數變成局部,不能供其他js調用。 因此棄用了webpack。選用了uglifyjs。 原因: ...
  • 手風琴案例+stop的使用(解決動畫隊列的問題) stop();// 停止當前正在執行的動畫 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> * { margin: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...