redux以及相关

react 只是轻量级的视图层框架,大型的应用应该拥有数据层框架配合使用。目前最好的应该是 redux ,是一种很好解决 组件传递数据的一种规范。

这里写图片描述

什么是redux
flux也是facebookreact一起发布的数据管理工具,但是后期使用中发现不能完美的解决数据统一的管理的理念,因此又引入了reducer的概念,形成了现在的redux,因此可以说:

 redux = reducer + flux 

一:redux 的基本使用方法

  1. 创建store仓库,使用createStore 进行创建,就类似于创建了图书馆,但是当你借书的时候管理员不知道你要借那一本书,需要检索书的数据库,reducer就是这个数据库,只有利用这个书的数据库才能完整的创建一个图书馆谨记:store是唯一的。
// index.js
import {createStore} from 'redux'
import reducer from './reducer'

const store  =  createStore(
    reducer,
    // 浏览器端 redux-extension-devtool插件的检测配置
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
)
export default store
  1. 然后创建reducer.js ,也就是图书馆数据库,创建初始化的数据,返回的是一个函数,action是组件传递的动作
import {CHANGE_INPUT_VALUE} from './actionTypes'
// 默认的数据
const defaultDate = {
    nowInputValue:'',
    list:[]
}
export default (state = defaultDate,action)=>{
   if(action.type === CHANGE_INPUT_VALUE){
       // 深拷贝一份初始化数据,不能修改state,注意区别Object.assen()
      const newState = JSON.parse( JSON.stringify(state) )
      newState.nowInputValue = action.value
      return newState
  }
  // 必须要返回一个值,默认返回state
  return state
}

其中actionType.js是一份常量的配置表,为什么这么写? 常量变量错误会报出异常,字符串写错是不会报出异常,方便调试

export const  CHANGE_INPUT_VALUE = 'chane_input_value'

创建完上面,开始在组件里面使用

import store from './store'
import {CHANGE_INPUT_VALUE} from './store/store/actionTypes'
class TodoAntd extends Component{

    constructor(props){
      super(props)
      // store 提供的方法,获取store里面的数据,初始化页面数据
      this.state = store.getState()
      // 广播函数,监听store里面state的变化,只要一发生就会自动执行里面的函数,可以实现ui的变化
      store.subscribe(this.addEventInput) 
    }
 
    addEventInput = ()=>{
        // 使用store里面state改变该组件里面state数据,ui就会跟着发生变化
        this.setState( store.getState() )
    }

    handleInput = (e)=>{
         const action = {
            type:CHANGE_INPUT_VALUE,
            value:e.target.value
         }
        store.dispatch(action)
    }

**改进1:**在复杂的组件里面使用这样子创建action特别散,不方便统一管理,因此我们使用统一的对象进行创建action,新建一个actionCreator.js的文件。

import {CHANGE_INPUT_VALUE} from './actionTypes'
// 返回的是一个函数,里面自动返回一个对象
export const getHandleInput_action = (value) =>({
        type:CHANGE_INPUT_VALUE,
        value  
})

因此,最后修改组件里面的写法如下:

import store from './store'
import {CHANGE_INPUT_VALUE} from './store/actionTypes'
import {getHandleInput_action} from './store/actionCreator'
class TodoAntd extends Component{

    constructor(props){
      super(props)
      this.state = store.getState()
      store.subscribe(this.addEventInput) 
    }
    
    addEventInput = ()=>{
        this.setState( store.getState() )
    }

    handleInput = (e)=>{
        // 变化的地方,利用函数进行action的创建
        const action = getHandleInput_action(e.target.value)
        store.dispatch(action)
    }

总结1:

1:store 是惟一的
2:只有store 才能改变自己的内容,而不是reducer,注意一下,reducer必须是纯函数,就是给定固定的输入,输出的结果就是固定的,不能有其他的副作用

二: UI组件,容器组件,无状态组件。
ui 组件负责渲染,是一个傻瓜组件,容器组件负责逻辑,传值给ui组件,是聪明组件,在一般的react开发中更加高效简洁。

// 相关片段  容器组件处理完逻辑以后都传递给ui组件
render(){
    return(
        <TODO_UI 
           nowInputValue = {this.state.nowInputValue}  
           handleInput = { this.handleInput }
           keyPressfn = { this.keyPressfn }
           list = { this.state.list }
           deleteFn = { this.deleteFn }
        />
    )
}


// ui 组件 接受参数
export default class TODO_UI extends Component{
  render(){
    return(
        <div>
            <Input 
	            value={this.props.nowInputValue} 
	            onChange={this.props.handleInput}  
	            onKeyDown={this.props.keyPressfn}
	        />

            <List
	            bordered
	            dataSource={this.props.list}
	            renderItem={ (item,index) => (<List.Item onClick={ ()=>{ this.props.deleteFn(index) } } >{item}</List.Item>) }
            />
      </div>
    )
  }
}

无状态组件:当组件只有一个render的函数,就是一个无状态组件,其实就是一个函数,接受一个参数props,返回的是jsx片段
远比普通组件的性能高很多,就是一个普通的函数,因此使用无状态组件定义一个组件性能更加优、

import React,{Fragment } from 'react'
 const TODO_UI = (props) => {
    return(
        <Fragment>
            <Input 
            placeholder="今天的计划1"
            value={props.nowInputValue} 
            onChange={props.handleInput}  
            onKeyDown={props.keyPressfn}
        />

            <List
            bordered
            dataSource={props.list}
            renderItem={ (item,index) => (<List.Item onClick={ ()=>{ props.deleteFn(index) } } >{item}</List.Item>) }
            />
      </Fragment>
    )
}
export default TODO_UI
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值