Redux在React中的使用

Redux在react中的使用方法

作为一个用习惯了vuex的Vuer,第一次用redux真的想哭了,繁琐的操作,变态的写法,好在经过一天认真的阅读了下官网的说明,算是简单搞清楚了使用方法,简单的跟vuex对比一下,做个记录,以下文字相对白话,只是为了方便理解

简单定义一个todolist

1. 定义reducer

redux中的reducer类比vuex的mutations,都是更改state,不同点在于redux需要将新的state返回,vuex不需要,多个reducer可以分多个js文件,然后在index.js中通过combineReducers将reducer合并,类似vuex的Modules,实例代码

 const todos = (state = [], action) => {
     switch (action.type) {
         case 'ADD_TODO':
             return [
                 ...state,
                 {
                     id: action.id,
                     text: action.text
                 }
             ]

         default:
             return state;
     }
 }
 export default todos
import { combineReducers } from 'redux'
import todos from './todos'
export default combineReducers({
    todos
})

2. 定义action

redux的action,是定义需要调用那个reducer,主要是根据type字段,对应reducer的action.type,同时也可以传递一些参数,实例代码

let nextTodoId = 0;
export const addTodo = (text, id = nextTodoId++) => ({
    type: 'ADD_TODO',
    id: id,
    text
})

action不是必须要单独定义的,也可以在页面调用时直接写,例如

const actions = {
  increase: () => ({type: 'INCREASE'}),
  decrease: () => ({type: 'DECREASE'})
}
 
const store = createStore(reducer);
 
store.dispatch(actions.increase())

不过为了方便以后统一处理,最好还是单独定义一下

3. 定义containers

定义完了上面的reducer和action,最关键的是要在页面中调用,因此需要定义一些显示的组件,官网上是定义的components,然后在containers中调用,这里为了方便展示我就直接放containers中了,实例代码:

import React, { Component } from 'react'
import { connect } from 'react-redux'
import { addTodo } from '../actions'
import './index.css'
const mapStateToProps = state => ({
    todos: state.todos
})
const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        addToList: (value) => dispatch(addTodo(value)),
    }
}

class AddTodo extends Component {
    constructor(props) {
        super(props)
        this.state = {
            value: ''
        }
    }
    onChangeValue = (e) => {
        this.setState({
            value: e.target.value
        })
    }
    render() {
        const { todos, addToList } = this.props;
        return (
            <div>
                <input type="text" value={this.state.value} onChange={this.onChangeValue}></input>
                <div className="todos">
                    {todos.map((item, index) => {
                        return (
                            <div key={index}>{item.id + ':' + item.text}</div>
                        )
                    })}
                </div>
                <button type="button" onClick={addToList.bind(this, this.state.value)}>增加</button>
            </div>
        )
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(AddTodo)

从上往下挑一些重点说明一下

  • import { connect } from 'react-redux'最重要的引用,create-react-app默认是不带react-redux的,需要手动安装一下npm i -S react-redux redux,一定不要忘了还要装redux,官网就简单的说安装react-redux,只装一个会报错
  • mapStateToProps,简单理解就是将reducer中的state转换成页面可以用的props,同时也可以对state进行一些处理,类似vuex的getter
  • mapDispatchToProps,就是调用reducer的方法,接收两个参数,dispatch 和 ownProps,(value) => dispatch(addTodo(value))就是调用action中定义的type对应的方法,value是对应的参数
  • render中const { todos, addToList } = this.props,解构props,todos是mapStateToProps定义的对象,addToList是mapDispatchToProps定义的对象方法,使用方式和正常的props相同
    -最后导出组件connect(mapStateToProps, mapDispatchToProps)(AddTodo),写法比较固定,mapStateToProps如果没有不能不写,可以写成connect(null, mapDispatchToProps)(AddTodo)

4. app.js中展示

import React, { Component } from 'react';
import AddTodo from './containers/AddTodo'
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <AddTodo></AddTodo>
      </div>
    );
  }
}

export default App;

最后: 以上只是redux的最简单使用示例,方便从vue转过来的朋友参考学习,如果有不对的地方,希望能评论中指出

posted @ 2019-02-15 15:43  梦游生  阅读(613)  评论(0编辑  收藏  举报