您好,登錄后才能下訂單哦!
這篇文章主要介紹在小程序里如何使用Redux,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在小程序里使用 Redux 進行狀態管理, Redux 是一個前端狀態管理的容器,對于構建大型應用,對里面共享數據、狀態的管理非常方便,學過 React 的同學對它應該不陌生,如果還不了解的同學,不如進服瞧一瞧;
wepy 框架本身是支持 Redux 的,我們在構建項目的時候,將 是否安裝 Redux 選擇 y 就好了,會自動安裝依賴,運行項目后看官方給的 demo 確實是可以做到的,但是官方文檔里卻對這一塊只字不提,經過我自己嘗試了一波,這才稍微摸清了它的使用方式,趕緊拿來與你們分享~
運行我們的項目,發現官網已經給了我們一些 Redux 的使用方法,實際上主要是放在 store文件夾下面了,我們現在來一探究竟~
入口文件 index.js ,里面主要是 初始化 Redux , 其中 promiseMiddleware 是一個中間件,方便后面 action 做異步處理~ reducers 是一個純函數,用于接受 Action 和當前 State作為參數,返回一個新的 State ~
import { createStore , applyMiddleware } from 'redux' import promiseMiddleware from 'redux-promise' import reducer from './reducers' const Store = createStore( reducer , applyMiddleware(promiseMiddleware) ) export default configStore => Store
剩下三個文件夾分別是 types reducers 和 actions ,其中 types 用于定義我們要觸發的 action 的名稱,也就是表示 action 的名稱,這里我定義了 counter 和 list 兩個 types ,內容分別如下:
counter.js
export const INCREMENT = 'INCREMENT' export const DECREMENT = 'DECREMENT' export const ASYNC_INCREMENT = 'ASYNC_INCREMENT'
list.js
export const ADD = 'ADD' export const REMOVE = 'REMOVE'
最后通過 types 文件夾的入口文件 index.js 將他們暴露出去~
export * from './counter' export * from './list'
reducers 文件件存放我們的純函數,用來更改我們的狀態 , 他也有一個入口文件 index.js,定義如下:
import { combineReducers } from 'redux' import counter from './counter' import list from './list' export default combineReducers({ counter , list })
首先將 counter 和 list 的分別引入進來,通過 redux 定義的 combineReducers 函數,將所有的 reducers 合并成一個整體,方便我們后面對其進行管理!
那么 counter 和 list 對應的 reducer 分別是 什么樣的?我們直接看代碼:
counter.js
import { handleActions } from 'redux-actions' import { INCREMENT , DECREMENT , ASYNC_INCREMENT } from '../types/counter' const defaultState = { num: 0 , asyncNum: 0 } export default handleActions({ [INCREMENT](state){ return{ ...state, num : state.num + 1 } }, [DECREMENT](state){ return{ ...state, num : state.num - 1 } }, [ASYNC_INCREMENT](state, action){ return { ...state , asyncNum : state.asyncNum + action.payload } } },defaultState)
我們介紹一下 counter.js 里面的 reducer , 首先引入了 handleActions 方法用來創建 actions , 它將多個相關的 reducer 寫在一起也是 ,方面后期維護,也方便后期通過 dispatch來調用他們更改 state 里面的狀態,它主要接收兩個參數,第一個參數時候個大對象,里面存放多個 reducer , 第二個參數是初始化的時候 state 的狀態值,因此,我們一開始就定義了 defaultState ;
接著,我們看看里面的 reducer , 分別定義了 INCREMENT 、 DECREMENT 和 ASYNC_INCREMENT 三個 reducer ,前兩個比較簡單,分別是對 state 里面的 num 值進行 加減操作 , 最后一個是通過 action.payload 的值來對 asyncNum 的值進行異步操作的,具體怎么做到的,我們一會再看~
list.js 里定義的 reducer 跟上面類似,我就不一一介紹了,直接貼代碼即可~
list.js
import { handleActions } from 'redux-actions' import { ADD , REMOVE } from '../types/list' const defaultState = [ { title : '吃飯' , text : '今天我要吃火鍋' }, { title : '工作' , text : '今天我要學習Redux' } ] export default handleActions({ [ADD]( state , action ){ state.push(action.payload) return [...state] }, [REMOVE]( state , action ){ state.splice( action.payload , 1 ); return [ ...state ] } },defaultState)
我們終于走到這一步了,到這里,你已經離預期不遠啦,就剩一個 actions 文件件了,毫不例外,入口文件 index.js 如下:
index.js
export * from './counter'
很簡單,只需要將所需的 action 導出即可~
這個里面我只定義了 counter 的 action , 也就是為了剛才異步數據 asyncNum 準備的~
counter.js
import { ASYNC_INCREMENT } from '../types/counter' import { createAction } from 'redux-actions' export const asyncInc = createAction(ASYNC_INCREMENT,()=>{ return new Promise(resolve=>{ setTimeout(()=>{ resolve(1) },1000) }) })
這里跟 reducer 里面的要區分,這里是可以對數據進行一系列處理的,我們通過 createAction 創建一個 action , 該方法主要有兩個參數,第一個參數 type 表示 action 的類型,第二個參數 payloadCreator 是一個 function ,處理并返回需要的 payload ;如果空缺,會使用默認方法。這里我們是延遲 1s 后返回一個 1 ;
ok,到此為止,你已經基本完成了一個 redux 的容器~
接下來,就是展示它怎么使用的時候了~
我們創建一個 index.wpy 的文件,這里我把代碼直接貼出來,然后慢慢來分析看看~
代碼如下:
<template lang="wxml"> <view class="container"><text>同步{{ num }}</text><text>異步{{ asyncNum }}</text><button @tap="increment" type="primary">加一</button><button @tap="decrement" type="primary">減一</button><button @tap="asyncIncrement" type="primary">異步加一</button> <button @tap="addList">添加</button> <view class="box"><view class="item" wx:for-items="{{ todoList }}" wx:key="index"><view class="title">{{ item.title }}</view><view class="content">{{ item.text }}</view><button type="primary" class="delete" @tap="delete({{index}})">刪除</button></view></view> </view> </template> <script> import wepy from 'wepy' import { connect } from 'wepy-redux' import { INCREMENT , DECREMENT } from '../store/types/counter' import { asyncInc } from '../store/actions' @connect({ num(state){ return state.counter.num; }, asyncNum(state){ return state.counter.asyncNum; } },{ increment : INCREMENT , decrement : DECREMENT , asyncIncrement : asyncInc }) export default class Index extends wepy.page { components = {} computed = { todoList(){ return wepy.$store.getState().list; } } methods = { delete(index){ wepy.$store.dispatch({ type : 'REMOVE' , payload : index }) }, addList(){ wepy.$store.dispatch({ type : 'ADD' , payload : { title : '學習' , text : '好好學習' }}) } } onLoad () { console.log(wepy.$store.getState()) } } </script> <style lang="less">text{ display: block; text-align: center; margin: 10px auto; } button{ width: 90%; display: block; margin: 10px auto; } .item{ display: flex; align-items: center; text-align: center; padding: 0 15px; .title{ font-size: 14px; line-height: 20px; margin: 10px auto; } .content{ font-size: 15px; flex: 1; } .delete{ width: 70px; height: 40px; line-height: 40px; } } </style>
點一點看,發現臥槽,很牛逼,有木有~
ok~ 我們一起看看上面的代碼是怎么做的~
樣式結構方面我們這里不做討論,主要看 js 部分,其中 import { INCREMENT , DECREMENT } from '../store/types/counter' 和 import { asyncInc } from '../store/actions'分別表示從 counter 和 actions 導出所需的 action
我們重點看看 從 wepy-redux 中 引入的 connect ,這個 connect 很關鍵,它是連接 組件 和 狀態 的橋梁,主要用法是 @connect(states, actions) ~
states : 訪問 state 上的值,可以是數組或者對象,如果是對象的話,則包含的是 K-V對, V 可以是函數還可以是字符串,如果是字符串的話則默認獲取 state[V] , 否則的話則是使用返回值;而對于如果是數組的話(數組中的項只能為字符串),則認為是相同的 K-V 對象結構。 states 最終會附加到組件的 computed 屬性值上。
以上是“在小程序里如何使用Redux”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。