初学 redux 实现todolist

一. 为什么使用redux

1. React 只是一个用于构建用户界面的js库
2. 对于父子组件的调用, 只能通过图一左的那种方式一级一级的进行传值
3. 使用redux, 就可以构建一个store, 把需要进行转发的数值存储到仓库里,各个组件就可以很方便的存取。如图一右

分享图片                          分享图片分享图片

      图一                             图二                                                   图三

二. redux的传值方式理解。

react Components 可以理解为: 一个要在图书馆借书的学生
Action Creators 可以理解为一句话:我要借一本《水浒传》
Store 可以理解为: 图书管理员, 当他听到你要借《水浒传》,首先就是查看图书馆的书本的信息
Reducers 可以理解为: 图书馆的书本的信息, 在这个信息里面进行检索关于《水浒传》的信息, 然后反馈给管理员, 借书的学生就可以从管理员那里得到这个信息。

三. todolist 具体实现方式的讲解(图三)
一共三个dom元素, Input Button List 
1. TodoList 组件从store得到数据。 this.state = store.getState()
2. store.subscribe(this.funcName), 当store里的内容发生改变时,执行函数
3. Input 绑定onChange事件,当输入内容的时候,传值给store 里面的inputValue, 让inputValue 显示在Input上
4. Button绑定onClick事件,事件发生的时候,把该事件发生的消息传给store, List新增元素inputValue.
5. 每一个List元素, 绑定onClick 事件, 当点击发生时,把该事件发生的消息传给store, list 删除该元素。
四:代码
todolist.js
注意:发送给store的是一个action = {type:, ...}, 然后使用函数store.dispatch(action)把值传递给了reducer
reducer 根据得到的不同的action.type, 作出不同的动作。
分享图片
import React, { Component } from ‘react‘;
import { Button, Input, List } from ‘antd‘;
import store from ‘./store/index‘;

export default class TodoList extends Component{
    constructor(props){
        super(props);
        this.handleInputChange = this.handleInputChange.bind(this);
        this.handleBtnCLick = this.handleBtnCLick.bind(this);
        this.state = store.getState();
        this.handleStoreChange = this.handleStoreChange.bind(this);
        store.subscribe(this.handleStoreChange);
    }
    render(){
        return(
            <div style={{marginLeft:‘10px‘}}>
                <Input 
                    value={this.state.inputValue}
                    style={{width:‘300px‘, marginTop:‘10px‘}}
                    placeholder="Enter items" 
                    onChange={this.handleInputChange}
                />
                 <Button 
                     type="primary"
                     onClick={this.handleBtnCLick}
                 >提交</Button>
                 <List
                     style={{width:‘300px‘,  marginTop:‘10px‘}}
                    bordered
                    dataSource={this.state.list}
                    renderItem={(item, index) => <List.Item onClick={this.handleDeleteItem.bind(this, index)}>{item}</List.Item>}
                />
            </div>
        )
    }
    handleInputChange(e){
        const action = {
            type: ‘input_change‘,
            value: e.target.value
        }
        store.dispatch(action);
    }
    handleBtnCLick(){
        const action = {
            type: ‘add_item‘,
        }
        store.dispatch(action)
    }
    handleStoreChange(){
        this.setState(store.getState())
    }
    handleDeleteItem(index){
        const action = {
            type: ‘delete_item‘,
            index: index
        }
        store.dispatch(action)
    }
}
View Code

store/index.js

分享图片
import { createStore } from ‘redux‘;
import reducer from ‘./reducer‘;

const store = createStore(
        reducer, 
        window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
        )

export default store;
View Code

store/reducer.js

分享图片
const defaultState = {
    inputValue: ‘‘,
    list:[]
}

export default (state = defaultState, action) => {

    if (action.type === ‘input_change‘){
        let newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value;
        return newState;
    }
    if (action.type === ‘add_item‘){
        let newState = JSON.parse(JSON.stringify(state));
        newState.list.push(newState.inputValue);
        newState.inputValue = ‘‘;
        return newState;
    }
    if (action.type === ‘delete_item‘){
        let newState = JSON.parse(JSON.stringify(state));
        newState.list.splice(action.index, 1)
        return newState;
    }
    return state;
}
View Code
相关文章
相关标签/搜索
管家婆王中王开奖王 m· 郓城县| 长垣县| 偏关县| 汽车| 河西区| 德昌县| 康乐县| 石河子市| 读书| 晋中市| 武川县| 酒泉市| 宿迁市| 翁源县| 鄂伦春自治旗| 仁化县| 湛江市| 弋阳县| 巴中市| 井研县| 林芝县| 河池市| 鄂托克旗| 沂南县| 木里| 苗栗市| 利川市| 格尔木市| 罗甸县| 额济纳旗| 呈贡县| 广宗县| 个旧市| 乌恰县| 盐亭县| 南雄市| 元氏县| 石阡县| 土默特左旗| 海南省| 连山| 邯郸县| 宁武县| 扎兰屯市| 娱乐| 长乐市| 福鼎市| 襄汾县| 库车县| 武城县| 宝应县| 南郑县| 绩溪县| 革吉县| 桂林市| 文成县| 绥芬河市| 榆中县| 运城市| 丹东市| 盐城市| 卓资县| 苗栗市| 兴业县| 福清市| 岗巴县| 松江区| 凤冈县| 禄劝| 琼中| 永德县| 康乐县| 通辽市| 牙克石市| 镇巴县| 宜兰市| 柯坪县| 昌乐县| 汝州市| 洛隆县| 象山县| 屯昌县| 铜陵市| 竹溪县| 达孜县| 临潭县| 翼城县| 闻喜县| 锡林浩特市| 包头市| 敖汉旗| 勃利县| 金秀| 山丹县| 杭州市| 无锡市| 延川县| 东阳市| 灵山县| 原阳县| 益阳市| 封开县| 枣庄市| 海阳市| 黄山市| 秦皇岛市| 平南县| 栖霞市| 卢龙县| 南平市| 得荣县| 麻江县| 临江市| 宁明县| 富民县| 岗巴县| 甘泉县| 大邑县| 江永县| 龙井市| 农安县| 泸定县| 昌邑市| 霍林郭勒市| 无锡市| 洛隆县| 喀喇| 东乡族自治县| 呼玛县| 洮南市| 周至县| 泸州市| 北海市| 兴山县| 大石桥市| 喀喇| 泰兴市| 奎屯市| 江安县| 遂昌县| 阆中市| 澎湖县| 江阴市| 龙井市| 望谟县| 大方县| 德格县| 永新县| 肇州县| 临沧市| 苍山县| 肃宁县| 那曲县| 临朐县| 工布江达县| 闻喜县| 德安县| 怀化市| 仙桃市| 宜章县| 武穴市| 昆山市| 潞城市| 鹿泉市| 鹤庆县| 长兴县| 巴青县| 桃江县| 云林县| 昌邑市| 改则县| 临城县| 新昌县| 黄骅市| 晋城| 绥阳县| 老河口市| 长海县| 盐池县| 长沙县| 建阳市| 潼关县| 温州市| 筠连县| 房产| 四子王旗| 舒兰市| 武汉市| 安康市| 灌阳县| 忻城县| 阜宁县| 红桥区| 栾川县| 木兰县| 伊宁县| 崇州市| 七台河市| 济源市| 新闻| 嘉兴市| 玉林市| 积石山| 九龙县| 旬阳县| 江达县| 江达县| 丹江口市| 晋城| 湘阴县| 山东省| 大荔县| 葫芦岛市| 临清市| 大埔区| 利津县| 金门县| 会理县| 南川市| 延川县| 米脂县| 黔南| 高青县| 锡林浩特市| 永安市| 昌吉市| 田阳县| 家居| 营口市| 望谟县| 荃湾区| 沈丘县| 博兴县| 丰城市| 通城县| 菏泽市| 栾城县| 隆化县| 犍为县| 榆树市| 乐至县| 鄂托克前旗| 西乡县| 潜山县| 鹤山市| 达孜县| 琼中| 邛崃市| 攀枝花市| 略阳县| 玛纳斯县| 田阳县| 郯城县| 鸡泽县| 石嘴山市| 莲花县| 黎平县| 崇左市| 岳普湖县| 石首市| 丁青县| 五台县| 仙居县| 安溪县| 岗巴县| 自治县| 富宁县| 肇庆市| 义马市| 高唐县| 大港区| 寿光市| 广丰县| 霸州市| 瑞昌市| 乌鲁木齐市| 丰县| 枣强县| 依安县| 苍山县| 丹江口市| 娄烦县| 宁强县| 荔波县| 兴安县| 西丰县| 卓尼县| 嘉定区| 宁蒗| 苗栗市| 青田县| 平昌县| 山丹县| 万荣县| 伊金霍洛旗| 堆龙德庆县| 清原| 彭山县| 黄石市| 崇文区| 永福县| 元江| 武宁县| 潼关县| 梅河口市| 高邮市| 重庆市| 麻阳| 德江县| 巫山县| 云南省| 北流市| 苏尼特右旗| 晋州市| 岑巩县| 永泰县| 肃北| 临夏县| 五大连池市| 砚山县| 正蓝旗| 宁都县| 云和县| 云霄县| 衡阳县| 汉川市| 灵宝市| 利津县| 汾阳市| 两当县| 黔江区| 晋城| 定安县| 松溪县| 黄大仙区| 商河县| 札达县| 鄂伦春自治旗| 渝中区| 边坝县| 旬阳县| 黑龙江省| 京山县| 珠海市| 平度市| 横峰县| 湖南省| 东乡县| 牙克石市| 宁强县| 孝感市| 汽车| 高密市| 黔南| 石景山区| 安义县| 邻水| 西平县| 曲阜市| 仁化县| 株洲市| 郸城县| 东台市| 宝坻区| 琼海市| 沂水县| 库尔勒市| 长沙县| 大姚县| 虹口区| 宜章县| 城口县| 盐津县| 景洪市| 斗六市| 志丹县| 阿拉尔市| 陕西省| 遂宁市| 汝城县| 互助| 宁远县| 龙胜| 哈尔滨市| 秭归县| 盐亭县| 嵩明县| 朝阳市| 高唐县| 泰安市| 北流市| 南木林县| 裕民县| 江孜县| 吉木萨尔县| 平谷区| 夹江县| 牙克石市| 萨迦县| 五常市| 竹溪县| 伊吾县| 明光市| 色达县| 桃园市| 乌海市| 突泉县| 延边| 南江县| 阳东县| 二连浩特市| 承德市| 罗江县| 涡阳县| 金秀| 二连浩特市| 麻栗坡县| 新干县| 上林县| 永川市| 郧西县| 郯城县| 吴川市| 彭州市| 宿州市| 龙南县| 辛集市| 石渠县| 凌源市| 通渭县| 海伦市| 喜德县| 新竹市| 舒城县| 凯里市| 环江| 互助| 盐边县| 玉门市| 会泽县| 灵宝市| 兴和县| 天等县| 镇康县| 宾阳县| 尚义县| 浪卡子县| 勃利县| 道孚县| 巨鹿县| 长岭县| 东明县| 汉源县| 蓝田县| 区。| 揭西县| 肇州县| 馆陶县| 六盘水市| 宜黄县| 寿阳县| 裕民县| 灵川县| 略阳县| 新密市| 碌曲县| 新沂市| 武义县| 佛山市| 类乌齐县| 宁陕县| 甘洛县| 华蓥市| 麻江县| 昆山市| 江华| 大渡口区| 兴隆县| 获嘉县| 泸定县| 安图县| 武鸣县| 新竹县| 读书| 石泉县| 盐亭县| 旅游| 祁东县| 饶阳县| 汶川县| 盱眙县| 乐都县| 郸城县| 宜兰县| 灵璧县| 自贡市| 南江县| 离岛区| 高雄县| 宝坻区| 二手房| 通许县| 静安区| 固阳县| 黔西| 金华市| 武安市| 百色市| 霸州市| 临沂市| http://m.bo2020rates.fun http://www.gz1980busc.fun http://www.bo2020signals.fun http://wap.yqo1j4rl3v.fun http://m.gz1980changec.fun http://www.bo2020corrects.fun http://www.yqo1j2rl2v.fun http://wap.yqo3j5rl2v.fun http://m.gz1980institutec.fun http://www.bo2020speaks.fun http://wap.bo2020webs.fun http://wap.yqo1j8rl8v.fun http://www.gz1980patchc.fun http://wap.gz1980printc.fun http://wap.bo2020ezptys.fun