国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

優雅的在React項目中使用Redux的方法

2019-11-19 12:32:31
字體:
來源:轉載
供稿:網友

或許你當前的項目還沒有到應用Redux的程度,但提前了解一下也沒有壞處

首先我們會用到哪些框架和工具呢?

React
UI框架
Redux
狀態管理工具,與React沒有任何關系,其他UI框架也可以使用Redux
react-redux
React插件,作用:方便在React項目中使用Redux
react-thunk
中間件,作用:支持異步action

|--src  |-- store        Redux目錄    |-- actions.js    |-- index.js    |-- reducers.js    |-- state.js  |-- components      組件目錄    |-- Test.jsx  |-- App.js        項目入口

準備工作

第1步:提供默認值,既然用Redux來管理數據,那么數據就一定要有默認值,所以我們將state的默認值統一放置在state.js文件:

// state.js// 聲明默認值// 這里我們列舉兩個示例// 同步數據:pageTitle// 異步數據:infoList(將來用異步接口獲?。〆xport default {  pageTitle: '首頁',  infoList: []}

第2步:創建reducer,它就是將來真正要用到的數據,我們將其統一放置在reducers.js文件

// reducers.js// 工具函數,用于組織多個reducer,并返回reducer集合import { combineReducers } from 'redux'// 默認值import defaultState from './state.js'// 一個reducer就是一個函數function pageTitle (state = defaultState.pageTitle, action) { // 不同的action有不同的處理邏輯 switch (action.type) {  case 'SET_PAGE_TITLE':   return action.data  default:   return state }}function infoList (state = defaultState.infoList, action) { switch (action.type) {  case 'SET_INFO_LIST':   return action.data  default:   return state }}// 導出所有reducerexport default combineReducers({  pageTitle,  infoList////

第3步:創建action,現在我們已經創建了reducer,但是還沒有對應的action來操作它們,所以接下來就來編寫action

// actions.js// action也是函數export function setPageTitle (data) { return (dispatch, getState) => {  dispatch({ type: 'SET_PAGE_TITLE', data: data }) }}export function setInfoList (data) { return (dispatch, getState) => {  // 使用fetch實現異步請求  window.fetch('/api/getInfoList', {    method: 'GET',    headers: {      'Content-Type': 'application/json'    }  }).then(res => {    return res.json()  }).then(data => {    let { code, data } = data    if (code === 0) {      dispatch({ type: 'SET_INFO_LIST', data: data })    }  }) }}

最后一步:創建store實例

// index.js// applyMiddleware: redux通過該函數來使用中間件// createStore: 用于創建store實例import { applyMiddleware, createStore } from 'redux'// 中間件,作用:如果不使用該中間件,當我們dispatch一個action時,需要給dispatch函數傳入action對象;但如果我們使用了這個中間件,那么就可以傳入一個函數,這個函數接收兩個參數:dispatch和getState。這個dispatch可以在將來的異步請求完成后使用,對于異步action很有用import thunk from 'redux-thunk'// 引入reducerimport reducers from './reducers.js'// 創建store實例let store = createStore( reducers, applyMiddleware(thunk))export default store

至此,我們已經完成了所有使用Redux的準備工作,接下來就在React組件中使用Redux

開始使用

首先,我們來編寫應用的入口文件APP.js

// App.jsimport React from 'react'import ReactDOM from 'react-dom'// 引入組件import TestComponent from './components/Test.jsx'// Provider是react-redux兩個核心工具之一,作用:將store傳遞到每個項目中的組件中// 第二個工具是connect,稍后會作介紹import { Provider } from 'react-redux'// 引入創建好的store實例import store from '@/store/index.js'// 渲染DOMReactDOM.render ( (  <div>    {/* 將store作為prop傳入,即可使應用中的所有組件使用store */}    <Provider store = {store}>     <TestComponent />    </Provider>  </div> ), document.getElementById('root'))

最后是我們的組件:Test.jsx

// Test.jsximport React, { Component } from 'react'// connect方法的作用:將額外的props傳遞給組件,并返回新的組件,組件在該過程中不會受到影響import { connect } from 'react-redux'// 引入actionimport { setPageTitle, setInfoList } from '../store/actions.js'class Test extends Component { constructor(props) {  super(props) } componentDidMount () {  let { setPageTitle, setInfoList } = this.props    // 觸發setPageTitle action  setPageTitle('新的標題')    // 觸發setInfoList action  setInfoList() } render () {  // 從props中解構store  let { pageTitle, infoList } = this.props    // 使用store  return (   <div>    <h1>{pageTitle}</h1>    {      infoList.length > 0 ? (        <ul>          {            infoList.map((item, index) => {              <li>{item.data}</li>            })          }        </ul>      ):null    }   </div>  ) }}// mapStateToProps:將state映射到組件的props中const mapStateToProps = (state) => { return {  pageTitle: state.pageTitle,  infoList: state.infoList }}// mapDispatchToProps:將dispatch映射到組件的props中const mapDispatchToProps = (dispatch, ownProps) => { return {  setPageTitle (data) {    // 如果不懂這里的邏輯可查看前面對redux-thunk的介紹    dispatch(setPageTitle(data))    // 執行setPageTitle會返回一個函數    // 這正是redux-thunk的所用之處:異步action    // 上行代碼相當于    /*dispatch((dispatch, getState) => {      dispatch({ type: 'SET_PAGE_TITLE', data: data })    )*/  },  setInfoList (data) {    dispatch(setInfoList(data))  } }}export default connect(mapStateToProps, mapDispatchToProps)(Test)

Redux三大原則

單一數據源
整個應用的 state 被儲存在一棵 object tree 中,并且這個 object tree 只存在于唯一一個 store 中

State 是只讀的
唯一改變 state 的方法就是觸發 action,action 是一個用于描述已發生事件的普通對象

使用純函數來執行修改
為了描述 action 如何改變 state tree ,你需要編寫 reducers

結語

感謝您的觀看,以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 麻阳| 鸡西市| 慈溪市| 开平市| 湘潭县| 疏附县| 永州市| 宁城县| 于都县| 临沭县| 南召县| 慈利县| 襄城县| 祁门县| 高唐县| 巧家县| 绥宁县| 靖边县| 福贡县| 进贤县| 交口县| 平邑县| 惠州市| 怀来县| 诸城市| 莱阳市| 洞口县| 得荣县| 大冶市| 治县。| 郸城县| 永年县| 鄯善县| 定安县| 舟山市| 鹿泉市| 庆安县| 钟祥市| 邵武市| 定南县| 阿克苏市|