初識react(二) 實現一個簡版的html+redux.js的demo

回顧

  • 初識react(一) 揭開jsx語法和虛擬DOM面紗
  • 初識react(二) 實現一個簡版的html+redux.js的demo
  • 初識react(三)在 react中使用redux來實現簡版計數器
  • 初識react(四) react中異步解決方案之 redux-saga
  • 初識react(五) 數據流終極解決方案 dva(零配置)

前言

首先糾正個誤區,redux可以配合jq等框架使用,并不單單局限于react。為了讓所有人都看懂,我們這里先只實現一個最簡單版本的 html+redux.js的使用。

為什么出現redux

隨著單頁面應用的復雜,多個沒有聯系的組件之間想要共享狀態(state)很困難,Redux的出現解決了數據問題

redux三大原則

單一數據源

  • 整個應用的state都被存儲在一個倉庫中,我們稱之為store,整個應用只能有一個store。

只讀的state

  • 唯一改變state的方法就是dispatch(action),即派發動作。

使用純函數執行修改

  • 為每個action用純函數編寫reducer來描述如何修改state

說了這么多,看不懂?沒關系,就是有三個概念 state、reducer、action。下面我們一一講解API

概念解析

1、store 倉庫

  • redux提供了一個createStore函數,用來生成store
  • store就是保存數據的地方,可以看成一個容器。整個應用只能有一個store
function createStore(reducer) { //將狀態放到一個盒子里 別人改不了...
}
let store = createStore(reducer)復制代碼

2、State 狀態

store對象包含所有數據。如果想得到某個時點數據,就要對Store生成快照。這種時間點的數據集合,就叫做State。 當前時刻的State,可以通過store.getState()拿到。

let state = store.getState()
復制代碼

3、action 動作

  • action必須是一個對象,type是必須的,用戶可以派發動作來改變state.
let action = {type:"change_title_text",text:"改變標題了"
}
復制代碼

4、store.dispatch(action) 派發動作

  • store.dispatch()是發出action的唯一方法
let store = createStore(reducer);
store.dispatch(action)  //action=>{type:"change_title_text",text:"改變標題了"}
復制代碼

5、Reducer 管理員,也可以稱之為處理器

  • Store收到派發的動作后即dispatch(action),必須返回一個新的state,這樣視圖才會變化。
  • 這種state的計算過程叫做Reducer,是一個純函數,接受state和action作為參數,返回一個新的state
let reducer = function(state,action){return new_state;
}
復制代碼

廢話了這么多,很慶幸把基本概念說完了,終于來個實戰來看看具體怎么工作的。我們做一個最簡單計算器,點擊加1,來看看redux怎么工作的

計數器實現步驟(redux)

1、聲明一個初始化狀態

let initState = {number:0}
復制代碼

2、createStore 重點

  • 創建倉庫,保存狀態,對外暴露當前狀態=>getState 和如何更改狀態的方法=>dispatch
let createStore=(reducer)=> { //將狀態放到一個盒子里 別人改不了let state ;  //聲明狀態function dispatch(action) { //派發 參數是action動作,action是一個對象state= reducer(state,action); //調用寫好的方法,這個方法會返回一個新的狀態}dispatch({}); //內部需要先定義次let getState = ()=> JSON.parse(JSON.stringify(state)); //獲取狀態的方法 深拷貝return {getState,dispatch};
}復制代碼
  • 需要知道 action是一個對象=>{type:"add",count:5},類型為add,每次點擊加5
  • 在創建倉庫的時候,會默認先調用,dispatch({}),給state賦值默認狀態
  • 對外暴露 getState方法,用戶可以 獲取最新狀態
  • 對外暴露 dispatch方法,用戶可以派發動作

當看不懂時,只要知道目的只有一個,就是在給state賦默認值。 先dispatch({})=>reducer(state,action)。就可以賦默認值拉,至于為什么,往下看

3、reducer實現

  • 管理員,可以根據類型返回不同的狀態
let reducer=(state=initState,action)=> { //管理員,負責如何更改狀態的switch (action.type) { //更改狀態 要有一個新的狀態覆蓋掉case "add":return {number:state.number+action.count}}return state;
};
復制代碼

好了,到目前為止,我們來梳理下思路

  • 我們會這樣調用 let store = createStore(reducer),這其中發生了什么,如何把初始狀態賦值給state的
  • 步驟dispatch({}) =>reducer(initState,action)=>state=initState

4、渲染頁面視圖為初始狀態

let store = createStore(reducer);
function render() {let content = document.querySelector('.content');content.innerHTML = store.getState().getState().number;
}
render();
復制代碼
  • 將頁面視圖與store中的state進行綁定。看效果

目前為止,一切完美,那我們怎么點擊按鈕改變狀態,只能通過store.dispatch()方法

5、點擊改變視圖

btn.onclick = function () {store.dispatch({type:"add",count:5});render()
}
復制代碼

到目前為止,一個最簡單的redux應用算實現了,其實redux還是比較簡單的,重點是理解它概念,后續會講解在react中如何使用redux

  • redux全部源碼解析,可以參考我總結
  • 更多優質文章參考

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450833.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

12個有趣的C語言面試題

摘要&#xff1a;12個C語言面試題&#xff0c;涉及指針、進程、運算、結構體、函數、內存&#xff0c;看看你能做出幾個&#xff01; 1.gets()函數 問&#xff1a;請找出下面代碼里的問題&#xff1a; #include<stdio.h> int main(void) { char buff[10]; memset…

超全Typora快速入門

文章目錄一.Typora快速入門1.代碼塊2.標題3.字體4.引用5.水平分割線6.圖片插入7.超鏈接8.列表9.表格10.任務列表11.數學表達式12.生成目錄13.表情符號14.定義腳注15.文件導出16.主題修改17.修改主題背景圖片18.設置背景透明度19.Typora 插入圖片調整大小20.字體和顏色21.頁內跳…

聊聊畢業設計系列 --- 系統實現

效果展示 github moment-server github地址 moment github地址 moment-manage github地址 articles 聊聊畢業設計系列 --- 項目介紹 聊聊畢業設計系列 --- 系統實現 前言 在上一篇文章中&#xff0c;主要是對項目做了介紹&#xff0c;并且對系統分析和系統設計做了大概的介紹。…

求職小記(持續更新)

自16年春正式工作以來也有兩年半了&#xff0c;也許是對現在leader的不滿。也許是想要折騰一下&#xff0c;也許還有也許&#xff0c;決定換一份工作&#xff0c;結束兩年零四個月的第一家it工作。從8月份的離職到十月底的offer經歷了很多&#xff0c;外面天慢慢的涼了&#xf…

js 實現用window.print()打印頁面中的部分內容,局部打印

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 如下方法&#xff1a; function printProof(){var printData document.getElementById("forPrint").innerHTML; // 只打印 f…

搞懂靜態變量static

文章目錄1.什么是static&#xff1f;2.static關鍵字的作用是什么&#xff1f;3.靜態變量和非靜態變量的區別&#xff1f;4.static可以修飾局部變量嗎&#xff1f;5.可以通過this訪問靜態變量嗎&#xff1f;6.靜態方法能否調用非靜態方法&#xff1f;7.靜態變量、普通變量、靜態…

神經網絡優化(二) - 滑動平均

1 滑動平均概述 滑動平均&#xff08;也稱為 影子值 &#xff09;&#xff1a;記錄了每一個參數一段時間內過往值的平均&#xff0c;增加了模型的泛化性。 滑動平均通常針對所有參數進行優化&#xff1a;W 和 b&#xff0c; 簡單地理解&#xff0c;滑動平均像是給參數加了一個影…

Docker完全自學手冊

阿里云大學免費課程&#xff1a;Docker完全自學手冊課程介紹&#xff1a;Docker 是 PaaS 提供商 dotCloud 開源的一個基于 LXC 的高級容器引擎&#xff0c;源代碼托管在 Github 上, 基于go語言并遵從Apache2.0協議開源。Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可…

Spring 之注解事務 @Transactional

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 先讓我們看代碼吧&#xff01; 以下代碼為在“Spring3事務管理——基于tx/aop命名空間的配置”基礎上修改。首先修改applicationContext…

超級程序員神話

摘要&#xff1a;大部分的程序員在思想里都會某種程度的承認&#xff0c;承認自己只是一個普通的程序員&#xff0c;但這世界上確實有一些超級程序員&#xff0c;在一個為企業開發應用的程序員和一個為谷歌寫搜索算法的程序員之間&#xff0c;或和一個開發用來控制讀寫頭從磁盤…

HashMap30連問,徹底搞懂HashMap

文章目錄一、背景知識1、什么是Map&#xff1f;2、什么是Hash&#xff1f;3、什么是哈希表&#xff1f;4、什么是HashMap?5、如何使用HashMap&#xff1f;6、HashMap有哪些核心參數&#xff1f;7、HashMap與HashTable的對比&#xff1f;8、HashMap和HashSet的區別&#xff1f;…

博弈論的算法總結

開頭先啰嗦一句&#xff1a;想學好博弈&#xff0c;必然要花費很多的時間&#xff0c;深入學習&#xff0c;不要存在一知半解&#xff0c;應該是一看到題目&#xff0c;就想到博弈的類型。 以及&#xff0c;想不斷重復不斷重復&#xff0c;做大量各大oj網站的題目&#xff0c;最…

Slog55_lua面向對象之lua類

Slog55_lua面向對象之lua類 ArthurSlog SLog-55 Year1 GuangzhouChina Aug 30th 2018 微信掃描二維碼&#xff0c;關注我的公眾號GitHub 掘金主頁 簡書主頁 segmentfault 現實中的事情不是根據人的喜好而定的 比如長在你嘴里的智齒 大部分情況下 你會因為自己&#xff0…

Spring中的@scope注解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Scope 簡單點說就是用來指定bean的作用域作用域 &#xff08;官方解釋&#xff1a;scope用來聲明IOC容器中的對象應該處的限定場景或者…

編程語言大比拼——誰的效率高

摘要&#xff1a;C、C、Java這幾個屹立不倒的開發語言&#xff0c;如果以功能點作為單位的話&#xff0c;誰的效率最高呢&#xff1f;如果在項目初期就能確定功能點數量&#xff0c;那么就可以很好的預測項目完成時間。這一點是不是對你很有幫助呢&#xff1f; 一份6000個項目的…

Hadoop之Flume詳解

1、日志采集框架Flume   1.1 Flume介紹     Flume是一個分布式、可靠、和高可用的海量日志采集、聚合和傳輸的系統。     Flume可以采集文件&#xff0c;socket數據包等各種形式源數據&#xff0c;又可以將采集到的數據輸出到HDFS、hbase、hive、     kafka等眾多…

搞懂Java的反射機制

搞懂Java的反射機制 1.什么是反射&#xff1f; java的反射機制是指可以在運行狀態下獲取類和對象的所有屬性和方法。 2.反射的作用&#xff1f; 1、在運行時獲取一個類/對象的成員變量和方法 2、在運行時創建一個類的對象 3、在運行時判斷一個對象是否屬于一個類 3.反射有哪些…

表單oninput和onchange事件區別

oninput事件是元素value發生變化是立刻觸發&#xff0c;而onchange是元素發生變化并且失去焦點時才會觸發。 轉載于:https://www.cnblogs.com/ykli/p/9565601.html

Struts2中<s:iterator>基本用法及示例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Struts2中<s:iterator>基本用法及示例 Iterator用于遍歷集合&#xff08;java.util.Collection&#xff09;或枚舉值&#xff08;j…

如何使用postman做接口測試

1、get請求傳參 只要是get請求都可以在瀏覽器中直接發&#xff1a; 在訪問地址后面拼 ?keyvalue&keyvalue 例如&#xff1a;在瀏覽器中直接輸入訪問地址&#xff0c;后面直接拼需要傳給服務器的參數http://api.nnzhp.cn/api/user/stu_info?stu_name小黑2、post請求&…