dva.js yield call/put使用完整流程

2023-11-16

这个项目是基于dva框架的一个rn项目,对于一个新手(其实我也是菜鸟来着)来说,有很好的学习意义

首先我们来看下目录的结构

徒手生撸-完成React-Native项目的first blood

把我们定义的service引入进来,定义一个GET_USER_INFO的effects,注意这个函数名称前面要有“*”,然后在函数中通过yield call() 来调用(数据接口方法 和 请求参数),yield表示同步调用,这个是generator提供的功能,大家有兴趣的可以自己搜索一下。这里有一个要注意的地方“namespace”这个参数的含义是命名空间,用于解决多个models之间的互相干扰的问题,我们存储所有数据都会在这个空间下。

 

我来写一个完整的数据请求流程

首先我们要有一个通用的数据请求处理类,这里我是直接从其他React项目中request.js文件直接拷贝过来的。他大概长这个样子,网上有很多request.js的封装,最后我们也会提供给大家一个下载地址,大家不用慌。

徒手生撸-完成React-Native项目的first blood

或者使用这份request.js:

使用:

getUserAuth: () => Request('/partyApp/authMenu/authList'),

代码:

import fetch from 'dva/fetch'
import Cookie from 'js-cookie'

export default (url, ...params) => {
  const randomTime = Date.now() + Math.floor(Math.random() * 10000)
  const timeStamp = (url.includes('?') ? '&t=' : '?t=') + randomTime
  const requestUrl = process.env.ZQMB_HOST + url + timeStamp
  let upload = ''
  const postArray = params.map(meta => {
    if (typeof meta === 'string') {
      return `'${meta}'`
    } else if (typeof meta === 'object') {
      if ('file' in meta) {
        const formData = new window.FormData()
        formData.append('file', meta.file)
        upload = 'upload'
        return formData
      } else {
        return JSON.stringify(meta)
      }
    } else {
      return meta
    }
  })

  return fetch(requestUrl, {
    mode: 'cors',
    method: 'POST',
    body: upload ? postArray[0] : postArray.join(','),
    headers: {
      'msg.callback': '',
      'auth.sysid': process.env.ZQMB_SYSID,
      'auth.permit': process.env.ZQMB_PERMIT,
      'auth.token': window.AUTH_TOKEN
    }
  })
    .then(res => {
      if (res.ok) {
        const newToken = res.headers.get('content-language')
        if (newToken) {
          window.AUTH_TOKEN = newToken
          Cookie.set('auth.token', newToken)
        }
        return res.json()
      } else {
        return null
      }
    }).then(json => {
      if (json) {
        const code = json.code
        if (code === -1) {
          /* eslint-disable prefer-promise-reject-errors */
          return Promise.reject({
            message: 'unLogin',
            status: 401
          })
        } else {
          return json
        }
      }
    })
}

 

这里有一个要注意的地方 在文件中引用的fetch不需要我们单独在头部import了。(这都是当初的辛酸史,有血,有泪,有屎)

有了通用请求处理类之后,我们需要定义我们自己的service,

徒手生撸-完成React-Native项目的first blood

 

友情提示,上图中url地址需要替换成你们自己的数据接口哦!!!

之后我们需要新建一个models文件

徒手生撸-完成React-Native项目的first blood

 

要做的是,把我们定义的service引入进来,定义一个GET_USER_INFO的effects,注意这个函数名称前面要有“*”,然后在函数中通过yield call来调用我们的数据接口,yield表示同步调用,这个是generator提供的功能,大家有兴趣的可以自己搜索一下。这里有一个要注意的地方“namespace”这个参数的含义是命名空间,用于解决多个models之间的互相干扰的问题,我们存储所有数据都会在这个空间下。

现在我需要把我们文件和redux关联起来

徒手生撸-完成React-Native项目的first blood

 

在主文件App.js中,引入并关联我们自己的models,然后在我们自己的页面中调用他

徒手生撸-完成React-Native项目的first blood

 

分为两个部分 :

第一部分是通过connect来实现页面于redux的关联。

通过mapStateToProps这个配置,可以让我们在组件中使用 this.props来直接访问model中的state数据,在配置时要注意命名空间要对我们当初设置的一致。

第二部分是数据的调用

在componentDidMount函数中出发我们的数据加载函数,这里的payload中包含的属性,需要我们service中定义的保持一致。

好像一个整套的数据流程已经走完了。

现在我们对项目开发的三要素都了解了,接下来就可以在日常的需求开发中为所欲为了。因为作者本人也是菜鸟一个,所以和大家分享的主要还是一些使用的经验,并没有涉及到太多的概念于原理。 等我成长后,会再回来和大家一起聊聊原理的,我会回来的。。。

修改后的git地址

https://github.com/LeiDapeng/react-native-dva

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dva.js yield call/put使用完整流程 的相关文章

  • React Native Flatlist 不会在自定义动画底部表内滚动

    我创建了一张自定义动画底部表 用户可以上下移动底部滚动条 在我的底部工作表中 我使用了 flatList 来获取数据并将项目呈现为卡片 到目前为止 一切都按预期工作 但我遇到了平面列表滚动问题 在底部工作表内 平面列表不会滚动 我已经硬编码
  • 如何将变量传递给函数引用?

    在 React Native 中 当你有需要在渲染时运行并且必须传递变量的函数时 大多数人建议应该使用 onPress gt this functionName variable 然而 当处理大型列表和复杂组件时 您必须优化代码 为每个 r
  • Android 上的 React Native:无法运行程序“node”:错误=2,没有这样的文件或目录

    编辑 我不确定我采取了哪些步骤来解决此问题 并且不再看到此错误消息 因此我无法测试下面的解决方案 请单独尝试 因为不同的答案似乎适用于不同的人 iOS 版本工作正常 但在我的 Mac 上运行 Android Studio 时出现以下 Gra
  • React Native 输入组件仅接受数值

    在React Native项目中 我有一个来自Native Base的输入组件 我希望这个组件只接受数值0 9并给这个字段默认值 我寻找了关于这个问题的其他问题 我不知道也许那些答案是针对 textInput 组件的 或者不知何故建议对我不
  • 如何向 React 中的 onChange 函数传递附加参数

    所以 我遇到了这个问题 我这里有这种类型的元素 显然在更改输入时有事件 是否可以像这样传递参数并访问事件 如果是这样 我该怎么办 this function accepts two other params index stringValu
  • 如何在 React-Native 项目中实施和测试 Firebase Analytics?

    通过阅读我了解到Firebase官方支持react native https firebase googleblog com 2016 01 the beginners guide to react native and 84 html h
  • React Native v0.71.8 React-native-vector-icons 你看不到的图标

    我在用react native版本v0 71 8 我安装了react native vector icons库 但图标未显示 似乎链接在最新版本的 React Native 中不再起作用 所以我按照说明进行操作 但它不再编译 出现以下错误
  • 如何在React Native的MapView中设置标记

    我想在React Native中的MapView上设置一个标记 但是通过官方文档找不到任何信息MapView https facebook github io react native docs mapview html content 如
  • 为什么当我保存更改时,Expo 没有刷新?

    当我进行更改并保存它们时 模拟器中的应用程序不会刷新 我认为模拟器没有连接到 Metro 服务器 我尝试通过运行清除缓存expo r c 但这没有做任何事情 您是否尝试启用快速刷新 我遇到了同样的问题 但在启用 快速刷新 后 自动刷新再次开
  • 用于 React Native 的 Chrome 调试工具:多个问题

    预先感谢您的帮助 我宁愿是 RN 和 Android 的新手 我使用 create native init 来创建项目 Issue 1 when i first ctrl M and choose Debug JS Remotely it
  • 如何在 TypeScript 中使用 navigation.replace ?

    我试图在我的代码中使用它 const navigation useNavigation navigation replace AllFriends 但我不断收到错误消息 Property replace does not exist on
  • 键盘打开 React Native 时出现双击按钮问题

    我知道已经有很多关于这个主题的疑问 我已经尝试了每一步 但仍然无法解决问题 这是代码 render const sContainer sSearchBar styles if this props InviteState objectFor
  • 某些设备上的启动画面扭曲

    我在修复 Android 上的启动画面扭曲问题时遇到问题 我正在使用 React Native 请注意 这种情况仅发生在某些设备上 例如 我有一台 Android 版本为 4 2 2 的三星 启动画面不扭曲 而 Android 版本为 8
  • 找不到导航对象。您的组件是否位于导航器屏幕内?

    在我下面的代码中 当我使用 useNavigation 时 它会给出像我的问题一样的错误 如何使用useNavigation 请任何人都可以解决此错误 错误 找不到导航对象 您的组件是否位于导航器屏幕内 我从这里跟踪了代码https rnf
  • 如何在React-Native中选择ListView的一项?

    我是 React Native 的新手 我想使用 ListView 选择一项 当我第一次按下 item 时 ListView renderRow 被调用 但终究不起作用 我该如何修复这个错误 我的问题出在哪里 我写了一个演示here htt
  • 使用react-native使用WebView设置用户代理

    我想修改 WebView 中的用户代理字符串 以便在服务器端我可以检测到请求来自我的反应本机应用程序 我想使用 WebView 中的 source 属性来做到这一点 对于 IOS 和 Android 我该如何执行此操作 您只需将其设置为 W
  • 在 React Native (iOS) 中支持动态类型

    有谁知道如何在 React Native 中实现对动态类型的支持 理想情况下 我们希望监听何时有人更改了系统字体的大小 并执行某种类型的回调 或者更好的是 阻止在某些组件上实现字体缩放 好吧 事实证明你可以申请 allowFontScali
  • 反应本机谷歌日历

    我疯狂地搜索 寻找一个可以与谷歌日历一起使用的 React Native 包 获取事件数据并单独显示 标题 描述等 有人知道 React Native 的包吗 Cheers 我最终使用了react native calendar 但为自己创
  • React Native 中的“无法解析模块路径”

    添加新的依赖项后 我在 React Native 应用程序的红屏中收到错误消息 无法解析模块路径 我已尝试按照屏幕指示清除缓存 问题很简短 因为我自己回答 错误信息 无法解析模块路径 确实应该是 无法解析模块 路径 path是它无法加载的模
  • Keytool 不要求别名密码

    我正在尝试生成一个密钥库文件来签署我的 React Native Android 应用程序并将其发布到 Play 商店 我正在尝试按照本文档中的描述进行操作 https facebook github io react native doc

随机推荐

  • Kafka Producer 发送数据

    Kafka Producer 发送数据 1 生产者概览 1 不同的应用场景对消息有不同的需求 即是否允许消息丢失 重复 延迟以及吞吐量的要求 不同场景对Kafka生产者的API使用和配置会有直接的影响 2 Kafka发送消息的主要步骤 消息
  • 配置 RT-Thread 的工程目录

    1 前言 RT Thread 基于 Scons 的包管理非常方便让我们使用 RT Thread 进行开发 但在实际工程中将应用代码写到 RT Thread 官方提供的 bsp 目录下面会非常不便于使用 无法使用自己 git 工具进行代码管理
  • 使用IntelliJ IDEA通过Maven创建Spring的HelloWord(超详细图文教程)

    在JavaWeb中 随着Intellij IDEA的广泛使用 所用的Maven插件在以后的JavaEE中开发也将是个趋势 通过Maven仓库 我们可以不用下载所关联的Jar包就可以进行引用 还是很方便整个工程管理的 因为自己也是第一次接触S
  • 运算符相关知识点

    字符串转数值类型新增 隐式转换 隐式转换 正号 var a 10 console log typeof a console log typeof a 0 隐式转换 console log typeof a 1 隐式转换 console lo
  • iosArchive上传到AppStoreConnect

    首先 我们需要一个IOS开发平台上有一个开发者账号 https developer apple com programs enroll 这个平台可以注册个人账号或者公司账号 公司账号需要的资料更麻烦一点 但是功能也更多 在做好的开发者账号的
  • Win10家庭版远程桌面工具RDP Wrapper

    Win10家庭版远程桌面工具RDP Wrapper 由于win10家庭版官方不支持使用远程控制mstsc工具 但是使用RDP Wrapper可以解决该问题 解决办法 链接
  • uniapp 地图组件(map)的使用总结

    总结一下本次在uniapp中使用map遇到的一些问题 文章分别是基础 定位图标 获取自身经纬度 通过经纬度获取当时城市信息 首先先看成品 首先引入map组件
  • C++查看 IEEE 754 浮点数格式的代码

    把内容过程中较好的一些内容片段备份一次 下边资料是关于C 查看 IEEE 754 浮点数格式的内容 for binary floating point numbers IEEE 754 is to use a union as shown
  • qt在程序执行的过程中刷新界面

    qt程序执行的过程中 一般是不会仅仅通过setText函数将文字刷新到界面上 如果想根据需要不断地显示文字到主界面上该怎么做呢 为什么不会刷新界面呢 这是由于调用show函数之后 并不能显示界面 必须调用如下图片的中的a exec函数才能刷
  • 一键部署office的工具——OTool

    OTool可用于office的下载 安装和激活 其激活方式是调用kmspico服务器进行的 官方网站是https otp landian vip zh cn 最新版本5 9 3 6在2019 4 16发布 使用方式 下载 这个软件是绿化版的
  • C/C++队列操作

    1 链队结构 typedef struct queuenode int data struct queuenode next Queue typedef struct Queue fronts rear linkqueue 2 入队操作 进
  • 字符设备驱动-通过GPIO子系统提供的API实现LED驱动

    前言 写文章的目的是想通过记录自己的学习过程 以便以后使用到相关的知识点可以回顾和参考 一 GPIO子系统提供的API gpio 子系统提供了 API 函数来操作指定的 GPIO gpio 子系统向驱动开发人员屏蔽了具体的读写寄存器过程 这
  • STM32硬件I2C与软件模拟I2C超详解

    作者简介 嵌入式入坑者 与大家一起加油 希望文章能够帮助各位 个人主页 rivencode的个人主页 系列专栏 玩转STM32 保持学习 保持热爱 认真分享 一起进步 目录 一 I2C协议简介 二 I2C物理层 三 I2C协议层 I2C 基
  • 面试官问:SpringBoot中@Async默认线程池导致OOM如何解决?

    前言 1 最近项目上在测试人员压测过程中发现了OOM问题 项目使用springboot搭建项目工程 通过查看日志中包含信息 unable to create new native thread 内存溢出的三种类型 1 第一种OutOfMem
  • Node.js 学习系列(一) —— 入门

    nodejs 官网 https nodejs org zh cn nodejs下载地址 https nodejs org zh cn download Node js 是一个开源 跨平台的 JavaScript 运行时环境 简单的说 就是运
  • git 环境配置 + gitee拉取代码

    好嘛 配环境的时候 老是忘记这个命令行 干脆自己写一个记录一下 也不用搜了 1 先从git官网下载git 安装 2 然后从gitee拉取代码的时候提示 这是因为换了新电脑没有加入新的公钥啦 哎 所以老是记不住命令行 first git co
  • SSL和SSH有什么区别

    许多人对SSL和SSH感到困惑 这是可以理解的 两者都是安全协议 可以帮助保护从一个端点到另一端点的数据 此外 他们的名字有两个相似的字母 增加了歧义 但是SSH和SSL是两回事 如果您感到困惑 或者对选择哪种安全协议犹豫不决 本文将为您提
  • Rk3288 Android 7.1/8.1默认开启网络ADB端口

    Rk3288 系列开机默认没有打开网络ADB端口 可通过ADB手动改打开 ADB连接后 输入 adb tcpip 5555 Android 默认为5555 输入 adb connect ip地址 可以通过 adb devices 来验证 W
  • NSIS脚本学习:判断版本并安装.NET Framework运行环境

    前言 目前开发的程序以基于 net的应用程序为主 程序开发好后 需要进行安装包的生成 及setup文件的生成 常见的是NSIS工具 之前一直用的单文件打包工具 不适合将运行环境加进去 因此开始使用更高版本的NSIS 3 06 关于判断 NE
  • dva.js yield call/put使用完整流程

    这个项目是基于dva框架的一个rn项目 对于一个新手 其实我也是菜鸟来着 来说 有很好的学习意义 首先我们来看下目录的结构 把我们定义的service引入进来 定义一个GET USER INFO的effects 注意这个函数名称前面要有 然