转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/100713151 。

react-service是一个非常简单的用来在reactreact native中进行状态维护的包。

其用法非常简单,只有有限的几个属性和方法,非常好用。

官方文档在这里:https://github.com/caoyongfeng0214/react-service

用法如下:

首先,在自己的reactreact native项目中安装包:

npm install r-service -save

注意: 安装的包名是r-service,而不是react-service。实际上react-service是另一个不同的包。

react-service的概念里,Service是数据与UI之间的桥梁。Service用来处理数据,并维护状态,UI只负责数据的展示。可为每一类数据创建一个Service

可将所有的Service放在./service文件夹下。

以下为官方文档上的一个小示例:

./service/User.js

import Service from 'r-service';

class User extends Service{ // 每个Service继承自react-service中的Service
gets(){
if(!this.$data.users){ // 数据存储在 $data 中
// HTTP调用服务端提供的接口获取数据
var users = [
{id: 10, name: 'CYF'},
{id: 20, name: '张三丰'},
{id: 30, name: '袁崇焕'}
];
// 将数据使用 $set 方法存储到 $data 中
this.$set('users', users);
}
} remove(id){
var idx = this.$data.users.findIndex((T) => {
return T.id == id;
});
if(id >= 0){
this.$data.users.splice(idx, 1);
// 数据发生改变后,并不会立即应用到UI中,需调用 $apply 方法使之体现到UI中
this.$apply();
} // // 第二种方式
// var users = this.$data.users.filter((T) => {
// return T.id != id;
// });
// // 使用 $set 方法重新设置数据,将立即体现在UI中,而不用调用 $apply 方法
// this.$set('users', users);
}
}

每个Service需继承自react-service,其从父类中继承了一些方法和属性。所有数据存储在$data中。

$data中的数据发生改变后,需调用$apply()方法使更改体现到UI中。但如果使用$set(key, value)方法设置数据,则不用调用$apply()

在UI中,绑定Service$data中的数据。

./App.js

import React from 'react';
import {View, Text, Button} from 'react-native'; import User from './service/User'; class App extends React.Component {
constructor(props){
super(props); // 初始化Service,将当前组件作为参数传入,
// 这样,当前组件的状态就能在Service中维护了
this.user = User.init(this); // 调用Service中的方法获取数据
this.user.gets();
} remove(id){
// 调用Service中的remove方法
this.user.remove(id);
} render(){
// UI中的数据从Service的$data获取
return <View>
{
this.user.$data.users
?
this.user.$data.users.map((T) => {
return <View>
<Text>{T.id} : {T.name}</Text>
<Button title="Remove" onPress={()=>this.remove(T.id)}/>
</View>
})
:
null
}
</View>
}
}

以上是官方文档上的示例。

我再稍候补充一下,在另一个页面中展示同样的用户列表:

./pages/Users.js

import React from 'react';
import {View, Text} from 'react-native'; import User from './service/User'; class Users extends React.Component {
constructor(props){
super(props); this.user = User.init(this);
} render(){
return <View>
{
this.user.$data.users
?
this.user.$data.users.map((T) => {
return <View>
<Text>{T.id} : {T.name}</Text>
</View>
})
:
null
}
</View>
}
}

其实,第二个页面中使用的Service与第一个页面中的是同一个,因此,在第二个页面虽然没有调用gets()方法,但仍然能够绑定到数据。并且,在第一个页面中对数据的更改,也会同时反应到第二个页面中。

用react-service做状态管理,适用于react、react native的更多相关文章

  1. react框架的状态管理

    安装: cnpm install --save redux cnpm install --save react-redux   安装好后导入模块内容: impor {createStore} from ...

  2. react之redux状态管理

    1.传统MVC框架的缺陷 模型(model)-视图(view)-控制器(controller)的缩写 V即View视图:用户看到并与之交互的界面. M即Model模型是管理数据:很多业务逻辑都在模型中 ...

  3. React 回忆录(四)React 中的状态管理

    Hi 各位,欢迎来到 React 回忆录!

  4. 借鉴redux,实现一个react状态管理方案

    react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...

  5. 对于React各种状态管理器的解读

    首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...

  6. Mobx-React : 当前适合React的状态管理工具

    MobX 简单.可扩展的状态管理        MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商所赞助的.    安装 安装: npm install mobx ...

  7. React的状态管理工具

    Mobx-React : 当前最适合React的状态管理工具   MobX 简单.可扩展的状态管理        MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商 ...

  8. 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app

    为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...

  9. 你再也不用使用 Redux、Mobx、Flux 等状态管理了

    Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...

随机推荐

  1. 201871010104-陈园园 《面向对象程序设计(java)》第十周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  2. 【视频技术】ffmpeg截取图片(Mac)

    1. 输出单张图片:ffmpeg -i NLP-CNN.mp4 -f image2 -ss 2000 -vframes 1 -s 220*220 NLP-CNN-003.jpg 2. 输出所有图片: ...

  3. 【Spring IoC】Spring Bean(三)

    一.Spring Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象. ...

  4. VMware10新建虚拟机

    1. 新建虚拟机 2. 选择 “典型(推荐)(T)” 安装 3. “稍后安装操作系统”,创建一个空白硬盘 4. 选择 “Linux” 的 “CentOS 64位” 5. 设置 “虚拟机名称” 和 “位 ...

  5. TCP数据的传输过程(十)

    建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...

  6. 微信小程序 - 双线程模型

    小程序的双线程模型 官方文档给出的双线程模型: 小程序的宿主环境 微信客户端提供双线程去执行wxml,wxss,js文件. 双线程模型 1.上述的渲染层上面运行着wxml文件,渲染层使用是的webvi ...

  7. Mrmr:

    Feature selection: minimum redundancy and maximum relevance feature selection for high-dimensional d ...

  8. z+f数据解析

    1.先打开cmd2.把D:\qcc\编译和解析\debug_jiexi\SampleZFS.exe 拉进来.3.SampleZFS.exe -i *.zfs -o D:\*.txt 注意:*号代表文件 ...

  9. 论文阅读笔记六十一:Selective Kernel Networks(SKNet CVPR2019)

    论文原址:https://arxiv.org/pdf/1903.06586.pdf github: https://github.com/implus/SKNet 摘要 在标准的卷积网络中,每层网络中 ...

  10. [LeetCode] 727. Minimum Window Subsequence 最小窗口序列

    Given strings S and T, find the minimum (contiguous) substring W of S, so that T is a subsequence of ...