dva 快捷更新state和简化执行effects 插件


Keywords
dva, 类似vue双向绑定那样快捷修改 dva 状态, react
License
ISC
Install
npm install dva-bind@1.0.12

Documentation

dva-bind

简介

dva-bind可以类似vue双向绑定那样快捷修改 dva model里面的state和执行effect函数插件,并且兼容原来dispatch写法。

使用 bindObj.key = 'xxxxx' 赋值方式去修改model里面的state属性

// 修改dva model里面state的list属性(简化dispatch写法和省略编写reducers的方法去修改state属性)
bindObj.list = [1,2,3]

// 等价于dispatch写法
// 调用reducers的setList方法去修改state的list属性
dispatch({
	type:`${namespace}/setList`,
	payload:{
		list:[1,2,3]
	}
})

使用 bindObj.Ef.key( ) 方式去调用model里面的effects方法

// 调用dva model里面的effects的 addTodo方法
bindObj.Ef.addTodo({a:111,b:2222})

// 等价于dispatch写法
// 调用effects的addTodo方法
dispatch({
	type:`${namespace}/addTodo`,
	payload:{a:111,b:2222}
})

使用教程

安装插件

npm i dva-bind --save

绑定dva model

在model.js代码如下

import DvaBind from 'dva-bind'

const model = {
  namespace: 'todoModel',
  state: {
    list: [],
    data:{}
  },
  reducers: {
    save(state, { payload: { list } }) {
      return { ...state, list }
    }
  },
  effects: {
    *addTodo({ payload: value }, { call, put, select }) {
      //payload就是参入的参数
      console.log(payload)
    },
    *getData({ payload: index }, { call, put, select }) {
      // 模拟网络请求
      const data = yield call(todoService, payload.id)
			return data // 返回promise
    },
  }
}

//导出绑定model对象
export const todoModelBind = DvaBind(model) 

export default model

在组件里面使用方法

在class类组件使用

import React from ‘react’
import { connect } from 'dva'
import { todoModelBind } from '*/model'

class Temp extends React.Component{
  constructor(props){
    this.bindObj = todoModelBind(props.dispatch)
    // 修改todoModel state的list属性
    this.bindObj.list = [1,2,3,4,5]
    // 也可以调用todoModel 有promise 返回的effects的getData方法
    this.bindObj.Ef.getData({id:111}).then((data)=>{
      console.log(data)
    })
  }
  
  todoFun(){
   // 调用todoModel effects的addTodo方法
   this.bindObj.Ef.addTodo({a:111,b:333})
  }
  render(){
    return (
      <div>
        {
          this.props.todoModel.list.map((val)=>{
        		return <p onClick={()=>this.todoFun()}>{val}</p>
          })
        }
      </div>
    )
  }
}
export default connect(({todoModel})=>({todoModel}))(Temp)

在函数组件使用

import { useEffect } from 'react'
import { connect } from 'dva'
import { todoModelBind } from '*/model'
let bindObj
const Temp = (props)=>{
  useEffect(()=>{
    bindObj = todoModelBind(props.dispatch)
    // 修改todoModel state的list属性
    bindObj.list = [1,2,3,4,5]
  },[])
  const todoFun =()=>{
   // 调用todoModel effects的addTodo方法
   bindObj.Ef.addTodo({a:111,b:333})
  }
  return (
    <div>
      {
        props.todoModel.list.map((val)=>{
          return <p onClick={todoFun}>{val}</p>
        })
      }
    </div>
  )
}
export default connect(({todoModel})=>({todoModel}))(Temp)