React model

React model

有几个基本的属性:
namespace:model 的命名空间,只能用字符串。一个大型应用可能包含多个 model,通过namespace区分。
state:当前 model 状态的初始值,表示当前状态。
reducers:用于处理同步操作,可以修改 state,由 action 触发。reducer 是一个纯函数,它接受当前的 state 及一个 action 对象。action 对象里面可以包含数据体(payload)作为入参,需要返回一个新的 state。
effects:用于处理异步操作(例如:与服务端交互)和业务逻辑,也是由 action 触发。但是,它不可以修改 state,要通过触发 action 调用 reducer 实现对 state 的间接操作。
effects 有三个参数:
put:用于触发 action 。

yield put({ type: 'todos/add', payload: 'Learn Dva' });

call:用于调用异步逻辑,支持 promise 。

const result = yield call(fetch, '/todos');

select:用于从 state 里获取数据。

const todos = yield select(state => state.todos);

action:是 reducers 及 effects 的触发器,一般是一个对象,形如{ type: ‘add’, payload: todo },通过 type 属性可以匹配到具体某个 reducer 或者 effect,payload 属性则是数据体,用于传送给 reducer 或 effect。
例子

import { Effect, Reducer } from 'umi';
​
import { CardListItemDataType } from './data.d';
import { queryFakeList } from './service';
​
export interface StateType {
 list: CardListItemDataType[];
}
​
export interface ModelType {
 namespace: string;
 state: StateType;
 effects: {
   fetch: Effect;
};
 reducers: {
   queryList: Reducer<StateType>;
};
}
​
const Model: ModelType = {
 namespace: 'listAndcardList',
​
 state: {
   list: [],
},
​
 effects: {
   *fetch({ payload }, { call, put }) {
     const response = yield call(queryFakeList, payload);
     yield put({
       type: 'queryList',
       payload: Array.isArray(response) ? response : [],
    });
  },
},
​
 reducers: {
   queryList(state, action) {
     return {
       ...state,
       list: action.payload,
    };
  },
},
};
​
export default Model;
React中,useModel是一种常用的自定义钩子,它可以让我们更方便地管理应用程序中的状态。useModel一般用于管理全局状态,例如用户登录状态、主题等。 它的实现原理是使用React的Context API来创建一个全局的状态管理器,并通过useContext钩子来访问这个状态管理器。使用useModel钩子可以让我们更方便地对这个状态管理器进行操作。 下面是一个简单的useModel例子: ``` import React, { createContext, useContext, useState } from 'react'; const ModelContext = createContext(); const ModelProvider = ({ children }) => { const [count, setCount] = useState(0); const increment = () => setCount(count + 1); const decrement = () => setCount(count - 1); const value = { count, increment, decrement, }; return ( <ModelContext.Provider value={value}>{children}</ModelContext.Provider> ); }; const useModel = () => useContext(ModelContext); export { ModelProvider, useModel }; ``` 我们首先创建了一个ModelContext,用于存储全局状态。然后通过ModelProvider组件来包裹整个应用程序,并将状态和方法传递给子组件。最后,我们通过useModel钩子来访问这些状态和方法。 在组件中使用useModel钩子非常简单: ``` import { useModel } from './useModel'; const Counter = () => { const { count, increment, decrement } = useModel(); return ( <div> <p>Count: {count}</p> <button onClick={increment}>Increment</button> <button onClick={decrement}>Decrement</button> </div> ); }; ``` 在这个例子中,我们可以轻松地访问全局状态,并对其进行操作,而无需在组件之间传递props。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值