React进阶(3)-上手实践Redux-如何改变store中的数据

本文详细讲解了如何在React中使用Redux进行数据管理,特别是如何改变Redux store中的数据并实现页面更新。通过实例展示了创建action、dispatch action、编写reducer以及使用subscribe监听store变化的过程,从而实现todolist的添加和删除功能。同时,介绍了使用redux-devtools扩展进行调试的方法。
摘要由CSDN通过智能技术生成

虽互不曾谋面,但希望能和你成为笔尖下的朋友

以读书,技术,生活为主,偶尔撒点鸡汤

不作,不敷衍,意在真诚吐露,用心分享

点击左上方,可关注本刊

(祝今日天下有情人终成兄妹)

撰文 | 川川

VX-ID:suibichuanji

什么?文章内容不够看,等等..

点击文末左下方阅读原文,可看视频学习

   

前言

在前面的一文React进阶(2)-上手实践Redux-如何获取store的数据当中,已经知道组件怎么获取store的数据,并渲染到页面上,那么在该节当中揭示怎么更改store的数据,实现页面的更新

您将在本文当中学到

  • 编写action代码,确定具体要做的事情,它只负责创建对象

  • 改变store数据的唯一方法就是要派发action,需要通过调用store.dispatch函数

  • reducer纯函数中实现数据更新等逻辑判断操作 

  • 触发store,注册订阅subscribe函数,监听store数据的变化,保持页面的状态与store的同步

  • 重新获取store的数据,最终实现页面数据状态的更新

......

文章内容略有些长,建议扯纸的时间阅读,比较基础,如理解有误,欢迎路过的老师多提意见和指正

下面就一起来编写todolist的添加,删除等代码的,最终的效果图如下所示

(添加,删除todolist操作)


如何改变store的数据,实现页面的更新?


在前文的示例代码中已经知道组件怎么从store中取数据了,然而现在,如果想要更新state的数据?怎么办?

在reducer函数接收的第二个参数action就是接下来要干的事情了

在Redux中为了能够查看store中的各个状态,在chrome浏览器需先安装一个redux Devtools这个调试工具

当然安装这个插件,需要科学上网.如果没有的话,在qq浏览器的插件市场里也是能够找得到的

qq浏览器各种插件也是应有尽有,与在chrome控制台里调试是一样的

方式一:创建store的时候,进行composeEnhancers构建增强型的应用,在代码里添加配置,将window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),这行代码配置添加到createStore()的第二个参数上

const store = createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); // createStore第二个参数添加这个redux-devtools的配置可以开启调试功能

(需要浏览器安装redux-devtools插件)

(需要按照文档,对创建的store仓库配置一下)

(配置完后,刷新浏览器Redux调试工具就会出现了)

方法二:终端下安装redux-devtools-extension

npm install --save redux-devtools-extension

然后在主页面入口代码里,添加redux-devtools-extension拓展,同时引入applyMiddleware应用中间件,并在componseWidthDevTools中调用,如下所示

import { createStore, applyMiddleware } from 'redux'; 
import { composeWithDevTools } from 'redux-devtools-extension';
 
const store = createStore(reducer, composeWithDevTools(
  applyMiddleware()
));

以上两种方法都可以开启Redux的调试功能,第二种方法比较强大,推荐使用,这种配置完后,在各个浏览器都是可以使用的,至于其他一些额外拓展功能的,在后续的文章中,会不断会讲到

具体更改store的实例代码如下所示:

import React from 'react';
import ReactDOM from 'react-dom';
import { Input, Button, List } from 'antd'; // 引入antd组件库
import 'antd/dist/antd.css'; // 引入antd样式

// 1. 创建一个store管理仓库,从redux库中引入一个createStore函数
import { createStore } from 'redux';

// 2. 引入createStore后,store并没有创建,需要调用createStore()后才有store
const store = createStore(reducer,window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); // 创建好reducer后,需要将reducer作为参数传到createStore当中去,这样store才能拿到reducer的state数据

// 3. 创建reducer函数,管理组件共享的数据状态以及一些动作
// reducer是一个纯函数,返回一个新的state给store
// 4. 初始化state值,将原先组件内部的状态的数据,移除到reducer里面去管理
function reducer(state = {
    inputValue: 'itclanCoder',
    list: ['itclanCoder', '川川', '学习Redux']
}, action){
    console.log(state, action);
    if(action.type === 'handle_Input_Change'){
        // 对原有的上一次的state做一次深拷贝,在Redux中,reducer不允许直接修改state
      // const newState = Object.assign({}, state);这个Object.assign()也是一个非常常用浅拷贝的方法,与下面的方法最终实现的效果是一致的,等价于下面的方法
      // 创建了一个newState完全复制了state,通过对newState的修改避免了对state的修改
        const newState = JSON.parse(JSON.stringify(state));
        newState.inputValue = action.value; // 将新的value值赋值给newState
        return newState;
    }
    return state;
}

// TodoList组件
class TodoList extends React.Component {
    constructor(props){
        super(props);
        // 5. 在组件内部通过getState()方法就可以拿到store里面的数据
        this.state = store.getState();
        // this环境的绑定
        this.handleInputChange = this.handleInputChange.bind(this);
        this.handleStoreChange = this.handleStoreChange.bind(this);
        // 触发订阅,让store感知到state的变化
        store.subscribe(this.handleStoreChange); // 接收一个函数,重新获取store最新的数据,subscribe里面必须接收一个函数,会自动的调用this.handleStoreChange这个方法,保持store上的状态和this.state的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值