转载自: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. 201871010114-李岩松《面向对象程序设计(java)》第十五周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  2. Centos 安装Django2.1

    一.环境准备 1.1 服务器系统 Centos7 1.2.所需工具 python3(Django 2.0 版本是基于python3 版本,故而安装时需安装python3) Setuptools(> ...

  3. git clean (11)

    #delete untracked files git clean -f # delete untracked files and directories git clean -fd # -n opt ...

  4. Win10提示 该文件没有与之关联的程序来执行操作

    在Win10 2018年更新系统中,如果你手动删除注册表里的快捷箭头注册项,就会打开固定到底部任务栏的应用就会报错,要想恢复正常,先手动恢复原来删除的注册表项. 注册表位置:HKEY_CLASSES_ ...

  5. TensorFlow基础篇

    Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算.TensorFlow的运行机制属于“定义”和“运行”相分离.模型的构建只是相当于定义了一个图结构(代表一个计算任务),图中有 ...

  6. Python--单元四练习

    一.算24 描述: 给出4个小于10的正整数,可以使用加.减.乘.除4种运算以及括号把4个数连接起来得到一个表达式.现在问题是,是否存在一种方式使得所得表达式的结果等于24.‪‬‪‬‪‬‪‬‪‬‮‬‪ ...

  7. [LeetCode] 907. Sum of Subarray Minimums 子数组最小值之和

    Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarra ...

  8. 配置中心Apollo实战

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景. 服 ...

  9. Python 遍历目录下的子目录和文件

    import os A: 遍历目录下的子目录和文件 for root,dirs ,files in os.walk(path) root:要访问的路径名 dirs:遍历目录下的子目录 files:遍历 ...

  10. jQuery学习路线&review

    学习途径:http://www.w3school.com.cn/jquery/index.asp 路线图 转载自:https://www.cnblogs.com/lanren2017/p/723720 ...