zoukankan      html  css  js  c++  java
  • react redux的使用

    首先先说下我用redux,需要安装的东西。

    1. npm i redux -S
    2. npm i react-redux -S
    3. npm i redux-promise -S //实现异步 配合payload 解决action同步(插件)
    4. npm i redux-thunk -S //中间件
      Redux store 仅支持同步数据流。使用 thunk 等中间件可以帮助在 Redux 应用中实现异步性。
    可以将 thunk 看做 store 的 dispatch() 方法的封装器;我们可以使用 thunk action creator 派遣函数或 Promise,
    而不是返回 action 对象。
    5.cnpm i redux-persist -S 数据持久化

    直接一步把5个全安装了:  

    npm i redux react-redux redux-promise redux-thunk redux-persist -S
    

     

    在src下面建立三个文件夹,分别是 actions reducer store , 我后面的页面是home,  所以我在actions 和reducer里,分别建立了一个home.js 

    然后我顺便也多了3个, 一个是constants,里面建立了一个actionTypes.js(把公共的名字抽取了出来), reducer里建立了一个index.js 在那里统一引入reducer,然后抛出去,在store里注入。

    reducer home.js 写入

    const defaultState = {
      name: 'home',
    }
    
    export default function home (state = defaultState, action) {
       return state
    }
    

     

    reducer index.js写入

    import home from '@/reducer/home'
    
    export {
      home,
    }
    

      

    store index.js写入

    import {
      createStore,     //创建 store
      compose,         //配合谷歌浏览器Redux DevTools 2.17.0 使用的
      combineReducers, // 把多个reduce 合并一个reduce
      applyMiddleware, // 加载中间件的
    } from 'redux'
    import promise from 'redux-promise';    //实现异步。配合payload 解决action同步
    import thunk from 'redux-thunk'
    
    // 数据持久化
    import { persistReducer } from 'redux-persist' // 合并 reduce
    import storage from 'redux-persist/lib/storage' // 创建 store
    import autoMergeLevel2 from 'redux-persist/lib/stateReconciler/autoMergeLevel2' // 多层对象 做数据持久化
    
    import { home } from '@/reducer'  //所有reducer放一个公共地方
    
    // 我要对哪些 reduce 的 state 做数据持久化
    const rootPersistConfig = {
      key: 'reduxData',
      storage,
      stateReconciler: autoMergeLevel2,
      // 白名单 [reducer 目录内的 reduce 文件名]
      whitelist: ['home0429'],  
    }
    
    const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose  //配合谷歌浏览器Redux DevTools使用的
    
    // 抽离出一个需要持久化的公共 reduce
    const myPersistReducer = persistReducer(
      rootPersistConfig,
      combineReducers({
        home,
      })
    )
    
    const store = createStore(
      myPersistReducer,
      composeEnhancers(applyMiddleware(thunk, promise))
    )
    
    export { store }
    
    /**
     * redux 状态管理工具 管理一些变量
     * store 一个项目只会有一个store
     * redux数据流:view用户界面(onClick)操作 => action(动作) => reduce (修改state)
     * redux 三大原则
     */
    

      

    根目录的index.js写入  这里的话,我是把路由简单配了下, 我建立了一个router文件。 里面建立了一个index,js

    import React from 'react';
    import ReactDOM from 'react-dom';
    import { Provider } from 'react-redux'   //Provider是容器组件,主要作用是接收Store
    import { persistStore } from 'redux-persist'    //redux 数据持久化
    import { PersistGate } from 'redux-persist/lib/integration/react'; //redux 数据持久化
    import { store } from './store'
    import Router from './router';  //简单配置路由
    
    ReactDOM.render(
      <Provider store={store}>
        <PersistGate loading={null} persistor={persistStore(store)}>  
          <Router />
        </PersistGate>
      </Provider>,
      document.getElementById('root')
    )
    

      

    router index.js代码如下,  然后我把需要加载的页面 放在了assembly文件里。 在这里统一引入

    import React, { Component } from 'react';
    import { BrowserRouter, Switch, Route } from "react-router-dom";
    import { Home } from './assembly';  //把需要加载的页面放一个公共地方
    import '@/index.less';
    
    export default class Router extends Component {
      render() {
        return (
          <BrowserRouter>
            <Switch> 
              <Route path='/' component={Home}/>
            </Switch>
          </BrowserRouter>
        )
      }
    }
    

      

    下面我写了个简单的例子。 reducer里 定义了一个name名字, 在home页面引入, 然后再定义了一个方法,来修改reducer state 的值

    home 页面写入

    import React from 'react'
    import { connect } from 'react-redux';
    import { editName } from '@/actions/home'
    
    export default @connect( state => {
      return{
        name: state.home.name  //获取值 
      }
    },{
      editName  //actions里写入的方法
    })
    
    class Home extends React.Component {
      edit = () => {
        this.props.editName(666)  //修改值
      }
    
      render() {
        return(
          <div className='page-home'>
            <button onClick={this.edit}>点击我修改name值</button>
            {this.props.name}  //获取值
          </div>
        )
      }
    }
    

      

    actions home.js写入

    import { HOME_EDIT_NAME } from '@/constants/actionTypes';
    
    const editName = option => {
      return{
        type: HOME_EDIT_NAME, //都是大写
        payload: option //必须是payload名字
      }
    }
    export {
      editName,
    }
    

      

    reducer home.js写入

    import { HOME_EDIT_NAME } from '@/constants/actionTypes';
    
    const defaultState = {
      name: 'home',
    }
    
    export default function home (state = defaultState, action) {
      switch (action.type) {
        case HOME_EDIT_NAME:
          // 必须返回一个对象
          return {
            ...state, //使用扩展运算符, 合并对象
            name: action.payload
          }
    
        default:
          return state
      }
    }
    

      

  • 相关阅读:
    POJ 3267 The Cow Lexicon(动态规划)
    POJ 1125 Stockbroker Grapevine(最短路径Floyd算法)
    HDU 2374 || SDUT2386 A Game with Marbles(简单题)
    JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
    基于SNMP的MIB库访问实现的研究
    一个兼容大多数浏览器 的 图片滚动的js
    C#获取本地计算机名,IP,MAC地址,硬盘ID
    中文首字母搜素的实现 sql函数
    xml文档的加密与解密
    修改Windows 2003 server远程桌面端口3389
  • 原文地址:https://www.cnblogs.com/yetiezhu/p/12814644.html
Copyright © 2011-2022 走看看