用react-service做状态管理,适用于react、react native
转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/100713151 。
react-service是一个非常简单的用来在react、react native中进行状态维护的包。
其用法非常简单,只有有限的几个属性和方法,非常好用。
官方文档在这里:https://github.com/caoyongfeng0214/react-service 。
用法如下:
首先,在自己的react或react 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的更多相关文章
- react框架的状态管理
安装: cnpm install --save redux cnpm install --save react-redux 安装好后导入模块内容: impor {createStore} from ...
- react之redux状态管理
1.传统MVC框架的缺陷 模型(model)-视图(view)-控制器(controller)的缩写 V即View视图:用户看到并与之交互的界面. M即Model模型是管理数据:很多业务逻辑都在模型中 ...
- React 回忆录(四)React 中的状态管理
Hi 各位,欢迎来到 React 回忆录!
- 借鉴redux,实现一个react状态管理方案
react状态管理方案有很多,其中最简单的最常用的是redux. redux实现 redux做状态管理,是利用reducer和action实现的state的更新. 如果想要用redux,需要几个步骤 ...
- 对于React各种状态管理器的解读
首先我们要先知道什么是状态管理器,这玩意是干啥的? 当我们在多个页面中使用到了相同的属性时就可以用到状态管理器,将这些状态存到外部的一个单独的文件中,不管在什么时候想使用都可以很方便的获取. reac ...
- Mobx-React : 当前适合React的状态管理工具
MobX 简单.可扩展的状态管理 MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商所赞助的. 安装 安装: npm install mobx ...
- React的状态管理工具
Mobx-React : 当前最适合React的状态管理工具 MobX 简单.可扩展的状态管理 MobX 是由 Mendix.Coinbase.Facebook 开源和众多个人赞助商 ...
- 为了弄懂Flutter的状态管理, 我用10种方法改造了counter app
为了弄懂Flutter的状态管理, 我用10种方法改造了counter app 本文通过改造flutter的counter app, 展示不同的状态管理方法的用法. 可以直接去demo地址看代码: h ...
- 你再也不用使用 Redux、Mobx、Flux 等状态管理了
Unstated Next readme 的中文翻译 前言 这个库的作者希望使用 React 内置 API ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...
随机推荐
- 201871010104-陈园园 《面向对象程序设计(java)》第十周学习总结
201871010104-陈园园 <面向对象程序设计(java)>第十周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- 【视频技术】ffmpeg截取图片(Mac)
1. 输出单张图片:ffmpeg -i NLP-CNN.mp4 -f image2 -ss 2000 -vframes 1 -s 220*220 NLP-CNN-003.jpg 2. 输出所有图片: ...
- 【Spring IoC】Spring Bean(三)
一.Spring Bean的定义 被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的.bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象. ...
- VMware10新建虚拟机
1. 新建虚拟机 2. 选择 “典型(推荐)(T)” 安装 3. “稍后安装操作系统”,创建一个空白硬盘 4. 选择 “Linux” 的 “CentOS 64位” 5. 设置 “虚拟机名称” 和 “位 ...
- TCP数据的传输过程(十)
建立连接后,两台主机就可以相互传输数据了.如下图所示: 上图给出了主机A分2次(分2个数据包)向主机B传递200字节的过程.首先,主机A通过1个数据包发送100个字节的数据,数据包的 Seq 号设置为 ...
- 微信小程序 - 双线程模型
小程序的双线程模型 官方文档给出的双线程模型: 小程序的宿主环境 微信客户端提供双线程去执行wxml,wxss,js文件. 双线程模型 1.上述的渲染层上面运行着wxml文件,渲染层使用是的webvi ...
- Mrmr:
Feature selection: minimum redundancy and maximum relevance feature selection for high-dimensional d ...
- z+f数据解析
1.先打开cmd2.把D:\qcc\编译和解析\debug_jiexi\SampleZFS.exe 拉进来.3.SampleZFS.exe -i *.zfs -o D:\*.txt 注意:*号代表文件 ...
- 论文阅读笔记六十一:Selective Kernel Networks(SKNet CVPR2019)
论文原址:https://arxiv.org/pdf/1903.06586.pdf github: https://github.com/implus/SKNet 摘要 在标准的卷积网络中,每层网络中 ...
- [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 ...