redux的使用

https://www.jianshu.com/p/7a6708cde333

安装:yarn add redux  react-redux --save

redux分为三个部分组成action  reducer  store

action可以触发reducer中的state   在改变共享状态的文件处使用

const { dispatch } = this.props;   //使用connect后会生成dispatch

dispatch(switchMenu(title));

export const type = {
    SWITCH_MEUN: ‘SWITCH_MEUN‘
}

export function switchMenu(menuName) {
    console.log(‘menuName‘,menuName)
    return { // 这个返回的就是reducer中的action
        type:type.SWITCH_MEUN,
        menuName: menuName
    }
}

reducer是放置与改变共享状态值的地方

Reducer是生成store的方法createStore的参数,Reducer是一个方法,它接收两个参数state和action 

state即当前组件间共享的数据,acion = {动作类别type,动作参数name}

import { type } from ‘../action‘;
const initialState = {
    menuName: ‘首页‘
}

export default (state = initialState,action)=>{
    console.log(‘action‘,action) // 使用dispatch调用action中的方法会触发更新state 获取到action之后根据type的不同来更改不同的值    类似于action:{type: "SWITCH_MEUN", menuName: "订单管理"}
    switch (action.type) {
        case type.SWITCH_MEUN:
            return {
                ...state, // 保存上一个状态值的写法
                menuName:action.menuName
            }
            break;
        default:
            return {...state}
            break

    }
}

store.js

// createStore是一个工厂方法,内里通过返回出去的方法作用于连保持了state(state就是共享数据)的生命
// 并返回了一个包括三个方法的对象,三个方法分别为getState,subscribe,dispatch
// getState即获取当前state也就是共享数据
// subscribe接收一个方法为参数,目的是注册这个方法为dispatch调用后的callback方法
// dispatch接收一个参数,这个参数是action = {动作类别, 动作参数}
// dispatch内部调用了Reducer并在Reducer执行完毕后执行subscribe注册的callback(一般用于更新组件渲染)
import { createStore } from "redux";
import reducer from ‘./../reducer‘;
const configureStore=()=>createStore(reducer) //没有用大括号包着的代表返回的意思  Reducer传入craeteStore生成store
export default configureStore //没有用大括号包着的代表返回的意思

在根节点处引入store

import React from ‘react‘;
import ReactDOM from ‘react-dom‘;
import ‘./public/css/index.css‘
import Route from ‘./route‘
import { Provider } from ‘react-redux‘
import configureStore from ‘./redux/store/index.js‘;
import * as serviceWorker from ‘./public/js/serviceWorker‘;
const store = configureStore(); //保存数据源的地方
ReactDOM.render(
    // Provider是提供数据源的地方 Provider将所有要共享数据的组件共同的父组件包裹起来
    //     并作为含有context的高阶组件,同时将store传入,作为context共享的内容
    <Provider store={store}>
        <Route />
    </Provider>
   , document.getElementById(‘root‘));

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

使用共享状态的文件的使用

import React from ‘react‘
import {Row, Col} from ‘antd‘
import ‘@/components/Header/index.less‘
import Unit from ‘../../unit/index‘
import Axios from ‘../../axios/index‘
import { connect } from "react-redux";

class Header extends React.Component{
    constructor(props) {
        super(props)
        this.state = {
            systime : ‘‘,
            weather: ‘晴转多云‘,
            weather_pic: ‘‘
        }
    }
    componentWillMount() {
        setInterval(()=>{
            let systime = Unit.formatetime(new Date().getTime())
            this.setState({
                systime: systime
            })
        },1000)
       Axios.jsonp({url:‘http://api.map.baidu.com/telematics/v3/weather?location=chengdu&output=json&ak=3p49MVra6urFRGOT9s8UBWr2‘})
       .then((res)=>{
           this.setState({
               weather: res.results[0].weather_data[0].weather,
               weather_pic: res.results[0].weather_data[0].dayPictureUrl
           })
       }).catch((err)=>{
           console.log(err)
       })
        //  JsonP(‘http://api.map.baidu.com/telematics/v3/weather?location=chengdu&output=json&ak=3p49MVra6urFRGOT9s8UBWr2‘,{},function(err,data){
        //     console.log(data)
        // })
    }
    render() {
        return(
            <div className="header">
                <Row className="header-top">
                    <Col span={24}>
                        <span>cjz管理后台</span>
                        <span href="#">退出</span>
                    </Col>
                </Row>
                <Row className="header-bottom">
                    <Col span={4} className="header-bottom-left">
                        <span>{this.props.menuName} </span>
                    </Col>
                    <Col span={20} className="header-bottom-right">
                        <span className="detail-time">{this.state.systime}</span>
                        <img className="weather-pic" src={this.state.weather_pic} />
                        <span className="weather-detail">{this.state.weather}</span>
                    </Col>
                </Row>
            </div>
        )
    }
}
const mapStateToProps = state => { //每个共享数据的组件都要通过mapStateToProps方法将state映射成自己可接收的props对象,之后通过this.props.menuName直接使用state中的值
    return {
        menuName: state.menuName
    }
};
export default connect(mapStateToProps)(Header); //第一个是接受回调方法  使用connect包裹Header组件

改变共享状态的文件

import React from ‘react‘;
import { Menu} from ‘antd‘;
import MeunList from ‘../../resource/navdata‘;
import { connect } from "react-redux";
import { switchMenu } from "../../redux/action";
import ‘@/components/NavLeft/index.less‘;
import { HashRouter, Link } from "react-router-dom";
const { SubMenu } = Menu;
class NavLeft extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            MenuNode: ‘‘,
            currentKey: ‘‘
        }
    }
    componentWillMount() {
        const nodeTree = this.renderMenu(MeunList)
        var routeKey = window.location.hash.substr(1);
        this.setState({
            MenuNode: nodeTree
        })
    }
    renderMenu = (data) => {
        return data.map((item) => {
            if (item.children) {
                return (
                    <SubMenu key={item.key} title={item.title}>
                       {this.renderMenu(item.children)}
                    </SubMenu>
                )
            }
            return (
                <Menu.Item key={item.key}> <Link to={item.key}>{item.title}</Link></Menu.Item>
            )
        })
    }

    handleClick = ({ item, key }) => {
        var title = item.props.children[1].props.children
        // 事件派发,自动调用reducer,通过reducer保存到store对象中
        const { dispatch } = this.props; //使用connect后会生成dispatch
        dispatch(switchMenu(title)); //使用dispatch调用action文件中的方法后会触发reducer中的方法,最终改变共享状态

    };
    render() {
        return (
            <HashRouter>
                <div className="left-bar">
                    <div className="logo">Logo</div>
                    <div className="nav"></div>
                    <Menu theme=‘dark‘ onClick={this.handleClick} style={{ width: 256 }} mode="vertical">
                        {this.state.MenuNode}
                    </Menu>

                </div>
            </HashRouter>
        )
    }
}
export default connect()(NavLeft);

原文地址:https://www.cnblogs.com/cazj/p/11370266.html

时间: 2024-09-30 06:26:18

redux的使用的相关文章

Redux 的基础概念-API

三个基本原则 整个应用只有唯一一个可信数据源,也就是只有一个 Store State 只能通过触发 Action 来更改 State 的更改必须写成纯函数,也就是每次更改总是返回一个新的 State,在 Redux 里这种函数称为 Reducer Actions Action 很简单,就是一个单纯的包含 { type, payload } 的对象,type 是一个常量用来标示动作类型,payload 是这个动作携带的数据.Action 需要通过 store.dispatch() 方法来发送. 比

ReactJS React+Redux+Router+antDesign通用高效率开发模板,夜间模式为例

工作比较忙,一直没有时间总结下最近学习的一些东西,为了方便前端开发,我使用React+Redux+Router+antDesign总结了一个通用的模板,这个技术栈在前端开发者中是非常常见的. 总的来说,我这个工程十分便捷,对于初学者来说,可能包含到以下的一些知识点: 一.React-Router的使用 Router是为了方便管理组件的路径,它使用比较简单,一般定义如下就行,需要注意的是,react-router的版本有1.0-3.0,各个版本对应的API大致相似,但也有不同,我使用的是2.X的,

redux+flux(一:入门篇)

React是facebook推出的js框架,React 本身只涉及UI层,如果搭建大型应用,必须搭配一个前端框架.也就是说,你至少要学两样东西,才能基本满足需要:React + 前端框架. Facebook官方使用的是 Flux 框架.本文就介绍如何在 React 的基础上,使用 Flux 组织代码和安排内部逻辑. 首先,Flux将一个应用分成四个部分: Flux 的最大特点,就是数据的"单向流动". 用户访问 View View 发出用户的 Action Dispatcher 收到

redux 初步理解

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px "PingFang SC" } 派发一个 action 给 reducer, r

理解Javascript的状态容器Redux

Redux要解决什么问题? 随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态). 这些 state 可能包括服务器响应.缓存数据.本地生成尚未持久化到服务器的数据,也包括 UI 状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等.管理不断变化的 state 非常困难.如果一个 model 的变化会引起另一个 model 变化,那么当 view 变化时,就可能引起对应 model 以及另一个 model 的变化,依

redux数据流

redux使用 reducer 来进行事件的处理,reducer 是一个纯函数,这个函数被表述为 (previousState, action) => newState ,它根据应用的状态和当前的 action 推导出新的 state.Redux 中有多个 reducer,每个 reducer 负责维护应用整体 state 树中的某一部分,多个 reducer 可以通过 combineReducers 方法合成一个根reducer,这个根reducer负责维护完整的 state. 当一个 act

数据流程redux

思考题: react+redux开发这么一个原型,要怎么开发? 整个redux流程的逻辑非常清晰,数据流是单向循环的,就像一个生产的流水线: store(存放状态) -> Container(显示状态) -> reducer (处理动作)-> store redux画图理解: redux 只是定义了应用的数据流程,只解决了 "数据层"(model layer) 的问题, 一般还会使用 react, angular 等作为"显示层" (UI laye

Flux --&gt; Redux --&gt; Redux React 入门 基础实例使用

本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推荐使用 ES6+React+Webpack 的开发模式,但Webpack需要配置一些东西,你可以先略过,本文不需要Webpack基础 入门,只是一些基础概念和用法的整理,更完整的内容推荐去看看文档,英文,中文 (不过我个人认为,官方文档的例子相对来说太复杂了,很难让新手马上抓住重点) (官方的例子正

redux源码解析-redux的架构

redux很小的一个框架,是从flux演变过来的,尽管只有775行,但是它的功能很重要.react要应用于生成环境必须要用flux或者redux,redux是flux的进化产物,优于flux. 而且redux还很小.那么redux是怎么做到单项数据流和一些让人惊奇的特性的呢.我们来看一下他的源码,从而学一些东西. redux里面都是一个一个的模块,一共9个模块,都导出了一些redux的方法,比如这个9,一个匿名函数,然后导出他写的方法.9里面就这一个方法.英文注释也蛮清楚的,检测类对象的方法.

图解Redux三大核心的关系

本周开始用react开发新项目了,而为了配合react我们选择了Redux框架来管理state.由于之前一直在业余时间学习react和腾讯地图api,无暇顾及学习redux,所以项目刚上手时对redux一无所知,虽然我们领导详细给我们说了这个框架的思路,但是还是听得云里雾里的,没办法啊做过和没做过真的有差好吗……不过硬着头皮一点点写了之后,慢慢就理解了这个框架的思想,其实还是蛮简单的.下面把我理解的redux基础思想画成图表,加深理解.欢迎批评指正. 注:Redux 是 JavaScript 状