1. 程式人生 > >前端進階(四)React和Redux

前端進階(四)React和Redux

React和Redux是相互獨立的兩個框架。

一、React

React 是一個採用宣告式,高效而且靈活的用來構建使用者介面的框架。具體參考React中文

React解決的問題(或者說React的優勢)是:

(1)通過給予程式設計師一個虛擬DOM供其渲染,這樣就避免了修改真正的DOM。並且當頁面狀態改變時,會對頁面的DOM做最小化修改,並重新呈現。這樣就可以(至少在理論上),讓程式設計師徹底不用考慮DOM效能。React 核心開發者、有 React API 終結者之稱的 Sebastian Markbåge 撰寫的React設計思想,能讓你從更高的位置來重新看待React。

(2)React的另一個優勢是函式式反應型程式設計(FRP)。在傳統的程式設計中,一個包含所有物件的程式中,各個物件的狀態都對應不同響應行為。當其中一個物件的狀態出現異常的時候,其他物件就會不知所措,導致Bug或崩潰。這種舊的方式已經用了很久了,這就是為什麼當頁面崩潰時,用"重新整理網頁或者重啟瀏覽器"會這麼的管用。

       與之相反,在FRP中,頁面的狀態被限制在一個特定的區域,程式設計師只能用無狀態的function來處理狀態改變。然後,這些狀態改變的結果會進入React的管道,被依次渲染。這種頁面渲染方式,有效的解決了上述的頁面崩潰。

React的核心是將UI元件化,由資料驅動UI的展現。但是如何管理資料模型、元件與資料模型之間的通訊,react並沒有很好的解決方案。

二、Redux

如果你不知道是否需要 Redux,那就是不需要它。

Redux 的創造者 Dan Abramov 又補充了一句。

只有遇到 React 實在解決不了的問題,你才需要 Redux 。

阮一峰

總結的需要用Redux的幾個場景。

  • 使用者的使用方式複雜
  • 不同身份的使用者有不同的使用方式(比如普通使用者和管理員)
  • 多個使用者之間可以協作
  • 與伺服器大量互動,或者使用了WebSocket
  • View要從多個來源獲取資料

如果遇到以下兩個問題時,你可能需要用到Redux了:

(1)跨頁面資料共享

(2)子元件通訊

Redux是一個流行的JavaScript框架,為應用程式提供一個可預測的狀態容器。Redux基於簡化版本的Flux框架,Flux是Facebook開發的一個框架。在標準的MVC框架中,資料可以在UI元件和儲存之間雙向流動,而Redux嚴格限制了資料只能在一個方向上流動。 具體參考

Redux中文

三、redux是怎麼解決React痛點的?

(1)通過react-redux提供的Provider元件,在根元件外面包一層,這樣根元件,以及所有的子元件都能拿到store。實現的原理是基於React自身提供的context屬性,但是react官方不推薦直接在元件中使用this.context。所以react-redux提供了另一種方法connect,通過connect將普通的UI元件升級為容器元件,同時將獲取store的細節也一併封裝在生成容器元件的程式碼中,從而容器元件可以直接拿到store。

<Provider store={store}>
    <App/>
</Provider>

class Foo extends React.Component{
    render() {
    const { text } = this.props;
    return <div>{text}</div>;
  }
}
const App = connect(
  mapStateToProps,
  mapDispatchToProps
)(Foo);

(2)使用純函式修改state,保證state變化可預測。每次更改都返回一個全新的state。
(3)遵守容器元件與展示元件分離的原則。這是redux一個重要的思想,容器元件和展示元件各司其職。

通過將元件分為智慧元件和傻瓜元件,在智慧元件處理資料邏輯,並將store中的state轉變為props傳遞給展示元件,對應mapStateToProps,將注入了dispatch的函式作為props傳遞給展示元件,對應mapDispatchToProps,通過發起action,更新state完成改變資料狀態。傻瓜元件僅僅通過容器元件傳進來的props進行UI展示,以及操作回撥。感知不到redux的存在,脫離redux框架也能使用,儘量保持無狀態(可包含少量的UI狀態)。

相關推薦

前端ReactRedux

React和Redux是相互獨立的兩個框架。 一、React React 是一個採用宣告式,高效而且靈活的用來構建使用者介面的框架。具體參考React中文。 React解決的問題(或者說React的優勢)是: (1)通過給予程式設計師一個虛擬DOM供其渲染,這樣就

前端react分路由打包

1、AsyncCommponent.js import React, { Component } from "react"; export default (importComponent) =&g

springboot-web——單元測試

context ice 通過 contex png www. throws .com 基礎知識 一、概述   基礎知識,參考:https://www.cnblogs.com/ysw-go/p/5447056.html 二、springboot的單元測試   1.入門測

CSSmargin

off clas gin 提升 list div 保持 tom 觸發 margin 元素尺寸:border-box DOM屬性裏的offsetWidth 和offsetHeight 元素內部尺寸: padding-box DOM屬性裏的clientWidth 和 clie

SpringCloud從入門到——使用SpringBoot搭建微服務

wid web api 進入 con cloud val 讀取 pat ase 內容   SpringBoot整合SpringCloud的Eureka、Zuul等組件,快速實現簡單易懂且具有服務熔斷、負載均衡的分布式架構1.0,體驗微服務的魅力。 版本   IDE:IDEA

Jdbc

***************************資料庫的隔離級別**************************** mysql 資料庫 這4種隔離級別都支援 預設的隔離級別 可重複讀 oracle 只支援 讀已提交、序列化 預設的隔離級別是 讀已提交   一.讀未提交 會出現髒

SpringCloud從入門到——生產環境下Eureka的完全分布式部署

分開 -s rip linux mas 此外 實例名 leo 版本 內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分布式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分布式的Eureka集群,確保開啟了p

SpringCloud從入門到——生產環境下Eureka的完全分散式部署

內容   由於前兩節的內容我們知道,開啟了preferIpAddress後,Eureka的偽分散式部署會提示replica不可用。這一節我們講解如何在生產環境下部署完全分散式的Eureka叢集,確保開啟了preferIpAddress後replica的可用性。 版本   IDE:IDEA 2017.2.

JavaScriptform表單校驗

前言       本章將學習表單的校驗,作為一個前面學習的總結! 方法 1.概念 我們知道,在學習HTML的時候,我們做了一個非常醜陋的表單,裡面有文字框、單選鈕、複選框等一系列表單元素。這些都是隨便填寫的,沒有加任何的校驗。也就是說正常情況下我們需

Android:Activity啟動過程(最詳細&最簡單)

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而且很容易看懂,非常推薦大家去看看(沒有收廣告費,單純覺得作者寫的很好)。 上一篇簡單的介紹了Android進階(三):Application啟動過程(最詳細&最簡單)

前端web安全

一、XSS xss: 跨站指令碼攻擊(Cross Site Scripting)是最常見和基本的攻擊 WEB 網站方法,攻擊者通過注入非法的 html 標籤或者 javascript 程式碼,從而當用戶瀏覽該網頁時,控制使用者瀏覽器。 xss 主要分為三類: 1、DOM

DataBinding

自定義屬性: Databinding提供了@BindingAdapter(“屬性名”)註解來完成自定義屬性。 如果要繫結多個屬性,屬性之間用英文的逗號隔開,例如@BindingAdapter(“bind:image” , “bind:test” ) 在JavaBean中定義

SQL Server AlwaysON從入門到4——分析部署Windows Server Failover Cluster

可以看到每個節點已經有一個相同的權重或者票數,但是再看動態節點權重(DynamicWeight列)已經重新平衡。節點4已經動態撤銷投票以便確保投票配置按奇數節點投票。提醒:在Windows 2012 R2中,唯一一個關閉動態節點權重功能的方式只有通過PowerShell實現。意味著微軟並不希望你關閉。現在我們

SSMSpring整合Mybatis-----Aop事務

Spring整合Mybatis-----Aop事務 首先對於Spring整合Mybatis有兩種方式那就是使用sql絕對定位以及使用Mapper代理來進行開發,本篇博文先來介紹第一種。        所謂的Sql絕對定位就是namespace+id得方式來進行定位

Dagger2

組織Component Component之間的關係有 依賴(dependencies),包含(SubComponent),繼承方式(extends)。我們在一個專案之中不可能只使用一個Component聯結器來注入物件完成注入工作,一般除了一個全域性的App

Android:Activity啟動過程(最詳細&最簡單)

1.前言 最近一直在看 《Android進階解密》 的一本書,這本書編寫邏輯、流程都非常好,而

緩存融合技術主要後臺

事務隔離 接口 在那 負責 control ice 重啟 發的 假設 Cache Fusion 原理 前面已經介紹了 RAC 的後臺進程,為了更深入的了解這些後臺進程的工作原理,先了解一下 RAC 中多節點對共享數據文件訪問的管理是如何進行的。要了解 RAC 工作

SQL ServerT-SQL查詢編程的背景

.com src 編程 server 分享 bubuko 進階 分享圖片 img SQL Server進階(一)T-SQL查詢和編程的背景

前端基礎十三:透徹掌握Promise的使用,讀這篇就夠了(轉)

https://www.jianshu.com/p/fe5f173276bd Promise的重要性我認為我沒有必要多講,概括起來說就是必須得掌握,而且還要掌握透徹。這篇文章的開頭,主要跟大家分析一下,為什麼會有Promise出現。 在實際的使用當中,有非常多的應用場景我們不能立即知道應該如

ServletJSP的靜態引入動態引入

前言       本章學習JSP靜態引入和動態引入的相關知識 方法 1.概念 我們通過前面的知識已經基本掌握了一個JSP頁面的基本組成。 問題:多個JSP檔案存在相同的資料,這個時候就很難受了。如果需求一改,我們要將這些JSP統統改一遍,十分繁瑣