dva中dispatch函数实现异步回调函数的方式

1 篇文章 0 订阅
1 篇文章 0 订阅

业务需求

最近写小程序的时候遇到想要在前端通过调用接口的结果,来判断是跳转到注册页面还是首页

方式一:通过callback

//index.js页面

//如果登录凭证code不为空
if (res.code)  {
    dispatch({
       type: 'VerificationModel/getToken',
       payload: {
           code: res.code,
           appid: appId,
           jobNum: '',
       },
       callback: (response) => {
           if (response.code === 0) {
                  Taro.showToast({
                    title: '登录成功',
                    duration: 2000,
                    icon: 'success',
                    mask: false,
                  })
                  Taro.switchTab({
                    url: '/pages/index/index'
                  })
            } else {
                  Taro.showToast({
                    title: '未注册,请先注册',
                    duration: 2000,
                    icon: 'none',
                    mask: false,
                  })
                  Taro.redirectTo({
                    url: '/pages/Register/index'
                  })
            }
       }
   })
}
//model.js页面

effects: {
    * getToken({payload, callback}, {call, put}) {
      const response = yield call(VerificationService.getAccessToken, payload);
      const {code} = response;
      //调用callback
      callback(response);
}

方法二:通过Promise

//index.js页面

//如果登录凭证code不为空
if (res.code)  {
   //new一个Promise对象,将resolve函数作为参数传给model中的异步函数
   new Promise((resolve) => {
         dispatch({
              type: 'VerificationModel/getToken',
              payload: {
                  code: res.code,
                  appid: appId,
                  jobNum: '',
                  resolve,
              }
         });
//then方法接收两个函数,第一个函数作为成功时的回调函数,第二个函数作为失败时的回调函数
   }).then((data)=>{
         console.log(data); //data打印出来是model中response的值
         if (data.code === 0) {
                  Taro.showToast({
                    title: '登录成功',
                    duration: 2000,
                    icon: 'success',
                    mask: false,
                  })
                  Taro.switchTab({
                    url: '/pages/index/index'
                  })
            } else {
                  Taro.showToast({
                    title: '未注册,请先注册',
                    duration: 2000,
                    icon: 'none',
                    mask: false,
                  })
                  Taro.redirectTo({
                    url: '/pages/Register/index'
                  })
            }
      },()=>{
         console.log('failed')
      })
}
//model.js页面

effects: {
    * getToken({payload, callback}, {call, put}) {
      const response = yield call(VerificationService.getAccessToken, payload);
      const {resolve} = payload;
      //调用resolve函数
      resolve(response);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
dva,Reducer 用于处理状态的变化,它接收旧的 state 和 action,然后返新的 state。下面是使用 dva 的 Reducer 的示例代码: ```javascript // models/example.js export default { namespace: 'example', state: { data: [], }, reducers: { saveData(state, { payload }) { return { ...state, data: payload, }; }, updateData(state, { payload }) { const { id, newData } = payload; const newDataList = state.data.map(item => { if (item.id === id) { return { ...item, ...newData, }; } return item; }); return { ...state, data: newDataList, }; }, }, }; ``` 在上述示例,我们定义了一个 `example` 模型,它具有一个初始状态 `state`,其包含一个名为 `data` 的数组。然后,我们在 `reducers` 对象定义了两个处理函数:`saveData` 和 `updateData`。 - `saveData` 函数用于存储数据。它接收一个 `payload` 参数,该参数包含要保存的新数据。通过使用对象展开运算符 `...` 来更新状态的 `data` 数组,将其替换为新的数据。 - `updateData` 函数用于更新数据。它接收一个 `payload` 参数,该参数包含要更新的数据的 `id` 和新的数据对象 `newData`。我们使用 `map` 方法遍历状态的 `data` 数组,找到与给定 `id` 匹配的项,并使用对象展开运算符 `...` 将新数据合并到该项。最后,我们返更新后的 `data` 数组。 在页面组件,可以通过 `dispatch` 方法来触发 Reducer,并传递相应的 action。 ```javascript import React from 'react'; import { connect } from 'dva'; function ExamplePage({ dispatch, example }) { const handleSaveData = () => { const newData = ['data1', 'data2', 'data3']; dispatch({ type: 'example/saveData', payload: newData }); }; const handleUpdateData = (id, newData) => { dispatch({ type: 'example/updateData', payload: { id, newData } }); }; return ( <div> <button onClick={handleSaveData}>Save Data</button> <button onClick={() => handleUpdateData(1, { name: 'New Name' })}>Update Data</button> {example.data.map((item, index) => ( <div key={index}>{item}</div> ))} </div> ); } export default connect(({ example }) => ({ example }))(ExamplePage); ``` 在上述示例,我们在页面组件定义了两个按钮点击事件的处理函数:`handleSaveData` 和 `handleUpdateData`。通过用 `dispatch` 方法并传入相应的 action,我们可以触发对应的 Reducer。 这就是在 dva 使用 Reducer 的基本示例。你可以根据实际需求编写更复杂的 Reducer 函数来处理状态的变化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值