React.js——Redux同步操作

前言
    每每提到Redux都会想起Vuex,相比起Vuex,Redux确实抽象了一些。官方文档给的入门的DEMO中的todoList,其中很多的代码逻辑都得自己去梳理。

容器组件和展示组件

    Redux的React绑定库是基于容器组件和展示组件相分离的开发思想。

展示组件

    作用:描述如何展现骨架、样式
    直接使用Redux:否
    数据来源:props
    数据修改:从props调用回调函数
    调用方式:手动

容器组件

    作用:描述如何运行数据获取、状态更新
    直接使用Redux:是
    数据来源:监听Redux state 即使用store.subscribe()从Redux state树种读取部分数据 通过props来把这些数据提供给要渲染组件
    数据修改:向Redux派发actions
    调用方式:通常由React Redux生成

connect()方法

    通过connect()方法将state、action和展示组件结合一起

Redux使用开发要点

actions

    首先要定义触发的事件以及要传递的数据,最终由action创建函数返回对象


    基本语法:

	const addtodo = (text) => {
		return {
			type: 'ADD_TODO',
			text  //需要携带给reducer的数据
		}
	}

reducer

    reducer用于针对特定的action_type返回特定操作进行后的state


    基本语法:

		//需要注意的是初始状态的state的值也是定义在reducer函数中的
		const todos = (state = [], action) {
			switch(action.type) {
				case 'ADD_TODO':
					return [...state, action.text]
				defatul:
					break
			}
		}
		//如果存在多个reducer  可以使用combineReducers  需要注意的是combineReducers from 'redux'  即需要npm install --save redux
		const todoApp = combineReducers({
			todos,
			...
		})

PS:现在看起来是不是感觉action和reducer并没有通过实际的代码联系起来

index.js 创建 store

	import todoApp from './reducers'
	import {createStore} 'react-redux'

	const store = createStore(todoApp)

容器组件(一般放在containers目录下)

    容器组件的类别:

  • 自己本身就是组件
	import React from 'react'
	import {connect} from 'react-redux'
	import {addTodo} from '../action'

	//{dispatch}相当于解构store
	let AddTodo = ({dispatch}) => {
    let input

    return (
        <div>
            <form
                onSubmit={e => {
                    e.preventDefault()
                    if (!input.value.trim()) {
                        return
                    }
           	         dispatch(addTodo(input.value))
                     input.value = ''
           	     }}
         	   >
         	       <input 
           	         ref={node => {
              	          input = node
               	     }} 
              	  />
              	  <button type="submit">
                   	 Add Todo
                	</button>
           		 </form>
        	</div>
    	)
	}

	//将AddTodo与store关联
	AddTodo = connect()(AddTodo)

	export default AddTodo
  • 不是组件,需要通过connect和展示组件绑定
	import {connect} from 'react-redux'
	import {toggleTodo} from '../actions'
	import TodoList from '../components/TodoList'

	const getVisibleTodos = (todos, filter) => {
    	switch (filter) {
      	  case 'SHOW_COMPLETED':
       	     return todos.filter(t => t.completed)
      	  case 'SHOW_ACTIVE':
       	     return todos.filter(t => !t.completed)
     	  case 'SHOW_ALL':
       	  default:
           	 return todos
   		 }
	}

	const mapStateToProps = state => {
    	return {
      	  todos: getVisibleTodos(state.todos, 	state.visibilityFilter)
   		 }
	}

	const mapDispatchToProps = dispatch => {
   	 	return {
       		 onTodoClick: id => {
             dispatch(toggleTodo(id))
       	 }
    	}
	}

	const VisibleTodoList = connect(
 	  mapStateToProps,
  	  mapDispatchToProps
	)(TodoList)

	export default VisibleTodoList

	//很简明的mapStateToProps、mapDispatchToProps都返回了对象,通过connect函数调用后,TodoLis组件可以通过props访问这些对象属性或函数
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值