page 下的index文件
import React, { Component } from 'react';
import {connect} from 'dva';
const nameSpace = 'list'
// @connect((state)=>{}) 第一个回调函数将page和model连接起来,返回model中的数据,并且将返回的数据绑定到this.props中
// 通过state[nameSpace]就可以获取该命名空间下的model中state数据
// 第二个回调函数:将定义的函数绑定在this.props中,调用model层中定义的函数
@connect((state)=>{
const listData = state[nameSpace].data
const maxNum = state[nameSpace].maxNum
return {
listData, // 可以通过this.props.listData来直接使用该数据
maxNum
}
},(dispatch)=>{ // dispatch可以调用model层中定义的函数
return{ // 将返回的函数绑定在this.props中
add:function () {
dispatch({ // 在type这里定义调用,固定格式nameSpace/函数名(reducers中定义的),可以调用reducers中的函数
type: nameSpace + "/addNewNumber"
})
},
init: ()=>{
dispatch({ // 和调用reducer中的方式类似,可以调用effects中的方法
type: nameSpace + "/initData"
})
}
}
})
class Index extends Component {
componentDidMount() {
this.props.init()
}
render() {
return (
<div>
{this.props.maxNum}
{this.props.listData.map((item,index)=>{
return (
<li key={index}>{item}</li>
)
})}
<button onClick={()=>{
this.props.add()
}}>点我</button>
</div>
);
}
}
export default Index;
model层的使用 this.props.add() -> dispatch -> addNewNumer() ->数据改变 -> render()重新渲染视图 使用effects中的方法同理
import request from '../../../../utils/request' export default { namespace: 'list', state: { data: [], maxNum: 0 }, reducers:{ addNewNumber:function (state,result) { // 这个state是更新前的对象 return的是之后新的数据 if(result.data){ return result.data } const newMax = state.maxNum + 1; const newArr = [...state.data,newMax] return { // 返回的是更新后的对象,更新数据,更新之后,render会重新调用,渲染页面 data: newArr, maxNum: newMax } } }, effects:{// 用于异步加载数据 *initData(params,sagaEffects){ //定义异步方法 const {call, put} = sagaEffects; // 获取到call和put方法 const url = '/api/list'; // 定义请求的url/ let data = yield call(request,url); // 执行请求 yield put({ // 调用reducers中的方法 type: "addNewNumber", //指定方法名,put可以调用reducers中的函数 data: data // 传递ajax传递回来的数据 ,会将这个data放在调用方法中的第二个参数当中 }) } } }
mock数据
export default { // 支持值为 Object 和 Array 'GET /api/list': function (req,res) { res.json({ data: [1,2,3,4], maxNum: 4 }) }, };