博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redux在react中的使用
阅读量:7042 次
发布时间:2019-06-28

本文共 3535 字,大约阅读时间需要 11 分钟。

简单的redux示例:

// 第一步 定义计算规则,即 reducer

function counter(state = 0, action) {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1
    default:
      return state
  }
}

// 第二步 根据计算规则生成 store

let store = createStore(counter)

// 第三步 定义数据(即 state)变化之后的派发规则

store.subscribe(() => {
  console.log('current state', store.getState())
})

// 第四步 触发数据变化

store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'INCREMENT'})
store.dispatch({type: 'DECREMENT'})

第一,要通过一个函数来触发数据的变化,即dispatch,触发的时候一定要符合之前定制的规则,否则无效。第二,数据一旦发生变化时,会导致怎样后果,即subscribe中定义的函数会执行。第三,如何取得当前的数据,即store.getState()

1、定义reducer

  • 定义具体规则 userinfo

 

  import * as actionTypes from '../constants/userinfo'

  const initialState = {}

  export default function userinfo(state = initialState, action) {

    switch (action.type) {
    // 登录
    case actionTypes.USERINFO_LOGIN:
      return action.data

    // 修改城市

    case actionTypes.UPDATE_CITYNAME:
      return action.data

    default:

      return state
    }
  }

 

  • 对所有的reducer 封装,对外提供统一的接口

   import { combineReducers } from 'redux'

   import userinfo from './userinfo'

  const rootReducer = combineReducers({

    userinfo
  })

 

 

       export default rootReducer

 

2、定义store

  import { createStore } from 'redux'

  import rootReducer from '../reducers'

  export default function configureStore(initialState) {

    const store = createStore(rootReducer, initialState,
      // 触发 redux-devtools
      window.devToolsExtension ? window.devToolsExtension() : undefined
    )
    return store
  }

3、结合react,程序的入口文件app/index.jsx

import { Provider } from 'react-redux'

import configureStore from './store/configureStore'

import Hello from './containers/Hello'

const store = configureStore()

render(

  <Provider store={store}>
    <Hello/>
  </Provider>,
  document.getElementById('root')
)

store通过 react-redux的Provider组件派发到Hello组件中

4、定义action,action是行为的抽象,必须有一个type属性

export function login(data) {

  return {
    type: actionTypes.USERINFO_LOGIN,
    data
  }
}

export function updateCityName(data) {

  return {
    type: actionTypes.UPDATE_CITYNAME,
    data
  }
}

  

5、Hello组件中使用reducer和action

  • 将reducer和action当作props传入到Hello中

     import * as userinfoActions from '../actions/userinfo'

  function mapStateToProps(state) {

    return {

      userinfo: state.userinfo
    }
  }

  function mapDispatchToProps(dispatch) {

    return {
       userinfoActions: bindActionCreators(userinfoActions, dispatch)
    }
  }

  export default connect(

    mapStateToProps,
    mapDispatchToProps
  )(Hello)

  • Hello中通过this.props.userinfo和this.props.userinfoActions获取数据和action

  class Hello extends React.Component {

    render() {

      return (
         <div>
            <p>hello world</p>
            <hr/>
            <A userinfo={this.props.userinfo}/>
            <hr/>
            <B userinfo={this.props.userinfo}/>
            <hr/>
            <C actions={this.props.userinfoActions}/>
        </div>
      )
  }
  componentDidMount() {
    // 模拟登陆 此处会触发数据变化,aciton中login的type对应reducer中的type,然后reducer响应type的操作是返回data,然后派发规则mapStateToProps,返回数据到props中。

    this.props.userinfoActions.login({

        userid: 'abc',
        city: 'beijing'
      })
    }
  }

   

mapStateToProps 如果这个没有传这个参数,那么组件就不会监听Redux store.

其实原因很简单,由于connect中只有mapStateToProps(state, [ownProps])是根据redux store state的改变进行改变的,而像mapDispatchToProps(dispatch, [ownProps])mergeProps(stateProps, dispatchProps, ownProps)都和redux store无关,所以如果mapStateToProps没有传的话,就不需要去监听redux store。

 

转载于:https://www.cnblogs.com/zhangxintong1314/p/6811656.html

你可能感兴趣的文章
DHCP服务和http服务
查看>>
bitnami 使用记录
查看>>
Vsftpd+(linux)文件服务器
查看>>
JEPLUS之循环报表—JEPLUS软件快速开发平台
查看>>
从一个线上问题分析binlog与内部XA事务提交过程
查看>>
网页版式设计与平面构图
查看>>
view桌面模板控制usb权限
查看>>
吾日三省吾身
查看>>
【office培训】【王佩丰】Excel2010视频教程第2讲:单元格格式设置
查看>>
android inflate
查看>>
libxml2的编译与安装
查看>>
详述Google针对Android平板App发布的十大开发准则
查看>>
CentOS 7安装python3笔记
查看>>
树莓派中文支持
查看>>
C# 如何去掉DataTable中的重复行
查看>>
UserInterfaceState.xcuserstate unlocked
查看>>
Android系统Recovery工作原理之使用update.zip升级过程分析(五)---u...
查看>>
android framework层简单研究
查看>>
深入解析Mac OS X & iOS操作系统
查看>>
结构体中使用函数指针
查看>>