一级片大奶子_色又黄又爽18禁免费视频_热久久久久久久_久久久精品一区二区_日韩av不卡在线播放_精品国内自产拍在线观看视频

商城系統 注冊

在小程序里使用Redux的教程

2018-06-06|HiShop
導讀:在小程序里使用 Redux 進行狀態管理, Redux 是一個前端狀態管理的容器,對于構建大型應用,對里面共享數據、狀態的管理非常方便...

在小程序里使用 Redux 進行狀態管理, Redux 是一個前端狀態管理的容器,對于構建大型應用,對里面共享數據、狀態的管理非常方便,學過 React 的同學對它應該不陌生,如果還不了解的同學,不如進服瞧一瞧;

wepy 框架本身是支持 Redux 的,我們在構建項目的時候,將 是否安裝 Redux 選擇 y 就好了,會自動安裝依賴,運行項目后看官方給的 demo 確實是可以做到的,但是官方文檔里卻對這一塊只字不提,經過我自己嘗試了一波,這才稍微摸清了它的使用方式,趕緊拿來與你們分享~

注意了,接下來劃重點了~

在小程序里使用Redux的教程

具體實現

運行我們的項目,發現官網已經給了我們一些 Redux 的使用方法,實際上主要是放在 store文件夾下面了,我們現在來一探究竟~

step1

入口文件 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

step2

剩下三個文件夾分別是 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'

step3

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)

step4

我們終于走到這一步了,到這里,你已經離預期不遠啦,就剩一個 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 的容器~

 

接下來,就是展示它怎么使用的時候了~

step5

我們創建一個 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 屬性值上。

  •  

電話咨詢 預約演示 0元開店
主站蜘蛛池模板: 日韩亚洲欧美中文字幕|国产精品久久久久久亚洲调教|5060网永久免费=a级毛片|人妻少妇久久久久久97人妻|国产成人无码=a区视频在线观看|欧美理论视频 | 国产色婷婷精品免费视频|#NAME?|亚洲综合欧美|综合亚洲精品|黑猫=aV第一福利网站|日韩欧美中文字幕一区二区三区 | 喷出高潮国语对白|久久精品视频一区二区|国产高清吃奶成免费视频网站|亚洲视频三级|免费一级黄色|久久综合给合久久狠狠狠97色69 家庭午夜影院|chinese老熟妇老女人hd|欧美成性色|中文字幕无码=a级毛片观看|日本在线观看中文字幕|久久国产精品偷导航 | 精品人妻中文字幕无码蜜桃臀|高清视频播放在线观看|色综合久久中文综合网|国产精品视频在线观看|美女爽到呻吟久久久久|亚洲国内精品 | 性情中人中文网|欧美老熟妇XB水多毛多|欧美波霸影院|炼气练了三千年第四季在线观看|免费一区二区三区在在线视频|艾草在线精品视频免费观看 | 久久撸视频|久久久久亚洲=aV无码专区喷水|国产成人无码精品久久二区三区|少妇扒开粉嫩小泬视频|欧洲黑大粗无码免费|亚洲成人=av | 日本xxx大片免费观看|久色在线三级三级三级免费看|视频一区在线播放|国产=a∨国片精品白丝美女视频|天美传媒=aV成人片免费看|成人天堂yy6080亚洲高清 | 国产一区2区3区|一级片=a=a|日韩欧美不卡一卡二卡3卡四卡2021免费|国产深夜福利在线|免费=a级黄色片|肉感饱满中年熟妇日本 | 日本最新免费二区|亚洲无人区一区二区三区|1769国内精品视频在线播放|色姑娘天天干|日本ssswww|国产vps毛片 | 国产精品视频专区|国产在线国产|精品一区二区三区成人精品|国产不卡在线观看免费视频|蜜桃综合|欧美精品日韩一区 | 久久精品国产清高在天天线|天堂在线观看www|毛片=av在线免费观看|精品国产欧美一区二区五十路|老熟女草BX×|人妻慢慢放弃抵抗开始迎合 | 精品国产一区二区三区久久久蜜臀|亚洲中文字幕无码一区在线|女同福利|国产一级视频在线观看|久久人妻公开中文字幕|#NAME? 午夜特片|中文久久久久|亚洲精品美女色诱在线播放|大地资源在线观看视频在线|99久久婷婷国产综合精品免费|豪放女大兵免费观看bd | #NAME?|人妻被按摩师玩弄到潮喷|我要一级毛片|国产精品一品道加勒比|亚洲黄色自拍视频|欧美久久免费 | 激情婷婷开心五月综合|国产区免费视频|欧美精品一区二区三区免费播放|亚洲一级片免费看|国产精品边做奶水狂喷无码|久久8精品 | 广东少妇大战黑人34厘米视频|日韩午夜在线|国产=aⅴ激情无码久久久无码|精品人妻无码一区二区三区色欲|日本阿v天堂|亚洲视频在线播放 | 国产精品成人v=a在线观看|久久网中文字幕|国产精品2区|色费色情人成视频|国产精品一区二区丝瓜|国产亚洲精品自在久久77 | 日韩国产精品久久|黄=a在线|日韩视频久久|欧美亚洲日韩国产人成在线播放|超碰成人在线免费观看|欧美大屁股BBBBXXXX | 国产成人毛片在线视频软件|日韩欧美一区二区三区不卡在线|中文亚洲字幕|91=av在线影院|涩涩视频在线看|欧美日韩在线观看二区视频 | 亚洲精品久久久久久无码色欲四季|成年人黄色=av|麻豆精品久久久久久久综合|亚洲国产日韩欧美在线|国产传媒懂得|亚洲综合色婷婷七月丁香 | 成人一区二区三区免费视频|日本=a=a=a=a片毛片免费观蜜桃|在线观看亚洲欧美|日本一夲道无码不卡免费视频|穿乳环蒂环上锁调教老师|国产成人综合一区二区三区 | 成人国产午夜在线观看|久久综合九色综合97欧美|99视频免费观看|久久久久久久国产精品毛片|久久99精品国产99久久|天堂成人国产精品一区 | 中国一级毛片视频|无码专区狠狠躁天天躁|日本高清视频一区|日韩欧美亚洲精品|欧美亚洲一区二区三区|精品欧美一区二区在线看片 | #NAME?|国产成人亚洲欧洲在线观看|午夜私人影院网站|九九九亚洲|亚洲=aV成人无码久久精品老人|#NAME? | 岛国片在线播放97|欧美成人精品一级在线观看|久久99精品久久久久久久|一区二区三区影院|国产=a久|成人一区久久 | 免费无遮挡无码视频网站|欧美人与ZOXXXX视频|色香婷婷综合激情网|亚洲综合久久无码色噜噜|欧美xxxx黑人又粗又长密月|国产精品九九久久久久久久 | 欧美性高清bbbbbbxxxxx|一级毛片免费观看|亚洲国产日韩=a在线欧观看美|日韩欧美特一级大黄作=a毛片免费|影音先锋无码=aⅴ男人资源站|欧美粗大猛烈老熟妇 | 亚洲欧美一级久久精品|在线观看午夜视频|日本日韩欧美|久久久新视频|国产精品一色哟哟|98精品在线 | 成午夜精品一区二区三区软件|精品亚洲第一|大地资源二在线视频观看|国产美女视频黄=a视频免费|亚洲国产成人=aV片在线播放|日本乱偷人妻中文字幕在线 | 久久麻传媒亚洲=av国产|久久久久国产精品麻豆|啪啪伊人网|亚洲精品久中文字幕花红影视|欧美丰满熟妇xxxxx|www.国产一区 | 亚洲精品.www|亚洲精品无码久久久影院相关影片|欧美日韩视频网站|在线观看潮喷失禁大喷水无码|免费看一区二区成人=a片|亚洲国产高清不卡视频 | 成年人天堂com|亚洲无线看|97成人啪啪网|国产精品无码一二区免费播放|亚洲精品国产福利一二区|农村乱人伦一区二区 | 欧美一区二区三区视频在线观看|日韩不卡高清|成人午夜视频无码免费视频|一道本道加勒比天天看|欧美成年人视频在线观看|日本中文字幕乱码免费 51久久夜色精品国产水果派解说|国产欧美日韩视频免费|国产96在线亚洲|人妻无码中文字幕免费视频蜜桃|成人=a片产无码免费视频奶头鸭度|亚洲已满18点击进入在线看片 | 国产黑人在线|日韩免费在线观看|99视频这里只有|麻豆国产一区|亚洲GV天堂无码男同在线观看|亚洲=aV中文无码字幕色三 | 蜜臀=aⅴ精品一区二区三区|5c5c5c5c|午夜免费|四虎影视最新免费版|色噜噜狠狠狠狠色综合久|精品服丝袜无码视频一区|国产一区日韩一区 | 一本久道在线|#NAME?|成人在线www|精品国产一区二区三区久久影院|精品日韩=av高清一区二区三区|chinese乱国产伦video | 久久国产精品精品|#NAME?|色免费观看|日韩乱码人妻无码中文视频|亚洲天堂777|天堂成人 | #NAME?|亚洲中文字幕无码=av在线|久久天天躁狠狠躁夜=av|91视频免费入口|午夜三级=a三级三点在线观看|国产乱码字幕精品高清=av | 中文乱码人妻一区二区三区视频|亚洲高清专区|中文毛片无遮挡高潮免费|黄人成=a动漫片免费网站|99re在线免费|女乱淫免费看视频大黄 | 欧美一区二区三区四区在线观看|天堂国产在线观看|一级片免费在线观看|毛茸茸xxxx|melody在线高清免费观看动漫|国产性色=aV高清在线观看 | 丁香花在线影院观看在线播放|成人网页在线|日本一码二码三码在线|偷拍25位美女撒尿bbb片户外|十八禁韩国女主播vip秀362视频|色哺乳xxxxhd国产 | 宝贝扒开下面自慰给我看|单亲乱l仑视频在线观看|久久久国产一区二区三区|激情久久久久久久久|久久国产精品久久精|国产三级在线免费 |