用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 ,直接实现状态管理的功能.看完这个库的说明后,没有想到代码可以这个玩.短短几行代码,仅仅使用 ...
随机推荐
- Anslble 部署安装
安装文档:https://ansible-tran.readthedocs.io/en/latest/docs/intro_configuration.html https://docs.ansibl ...
- 201871010108-高文利《面向对象程序设计(java)》第六七周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...
- LG2447/BZOJ1923 「SDOI2010」外星千足虫 高斯消元
问题描述 LG2447 BZOJ1923 题解 显然是一个高斯消元,但是求的东西比较奇怪 发现这个方程组只关心奇偶性,于是可以用一个\(\mathrm{bitset}\)进行优化,用xor来进行消元操 ...
- leetcode 561. 数组拆分 I
为了理解这种方法,让我们从不同的角度来看待问题.我们需要形成数组元素的配对,使得这种配对中最小的总和最大.因此,我们可以查看选择配对中最小值的操作,比如 (a,b)(a,b) 可能会产生的最大损失 ...
- 爬虫-js
js的RSA加密 var encrypt = new JSEncrypt(); encrypt.setPublicKey(publickey); # publickey是已知的 encrypt.en ...
- Xamarin.Forms移动开发系列3:项目剖析
摘要 本文主要进行Xamarin.Forms应用程序剖析. 前言 本文介绍Xamarin.Forms应用程序剖析. 由于本系列重点研究对象为Xamarin.Forms,所以对Xamarin.Andro ...
- [THUPC2018]生生不息(???)
SB题,写来放松身心. 首先 $n,m\le 5$,这是可以打表的. 本地怎么对于一个 $n,m$ 求答案?此时虽然复杂度不需要太优,但是还是得够快. 一个想法是枚举每个初始状态,不停模拟.因为总状态 ...
- [LeetCode] 147. Insertion Sort List 链表插入排序
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- 2019 SDN上机第1次作业
一.安装轻量级网络仿真工具Mininet 克隆github上的Mininet源 git clone https://github.com/mininet/mininet 选择默认全部安装 cd min ...
- jdk源码调试进去形参没有值
https://blog.csdn.net/u010407050/article/details/76690478 1.在你的D:盘新建jdk文件夹,然后在文件夹里面分别创建两个文件夹jdk_src( ...