React 组件和服务器

文章目录

    • 1. 请求服务器数据
    • 2. 发送开始停止请求
    • 3. 发送创建、删除、更新请求

learn from 《React全家桶:前端开发与实例详解》
https://zh-hans.reactjs.org/tutorial/tutorial.html
https://zh-hans.reactjs.org/docs/create-a-new-react-app.html#create-react-app

服务器负责持久化数据,React app 数据持久化于 data.json 文件中
在这里插入图片描述
书籍作者准备好了一个本地服务器 server.js (里面有一些 api 如 http://localhost:3000/api/timers 可以调用),data.json 数据

1. 请求服务器数据

使用 api 测试软件,get http://localhost:3000/api/timers

[{"title": "Mow the lawn","project": "House Chores","elapsed": 5458797,"id": "0a4a79cb-b06d-4cb1-883d-549a1e3b66d7","runningSince": null},{"title": "Clear paper jam","project": "Office Chores","elapsed": 1274709,"id": "a73c1d19-f32d-4aff-b470-cea4e792406a","runningSince": null},{"title": "Ponder origins of universe","project": "Life Chores","id": "2c43306e-5b44-4ff8-8753-33c35adbd06f","elapsed": 11750,"runningSince": 1456225941911}
]

作者给我们提供了 client.js
现在我们要从服务器获取 Timers 的配置

错误写法: const timers = client.getTimers(),网络请求是 异步(防止 IO 阻塞) 的,被调用的函数本身不会返回有用的值

可以:传递一个函数进去,如果服务器成功返回结果,getTimers() 将在服务器返回消息后,调用传入的这个函数

client.getTimers((serverTimers) => ( // do something use serverTimers ))

从服务器获取配置,每 5 秒刷新一下

class TimersDashBoard extends React.Component {state = {timers: []}componentDidMount() {this.loadTimersFromServer();setInterval(this.loadTimersFromServer, 5000);}loadTimersFromServer = () => {client.getTimers((serverTimers) => (this.setState({timers: serverTimers})))}...

期间报错了:

SyntaxError: Unexpected token ] in JSON at position 602at JSON.parse (<anonymous>)at D:/gitcode/react/time_tracking_app/server.js:27:19

报错是因为 json 文件格式问题 [{}, {}, {}, ] 最后一个 {} 后面不能跟 ,

不论你做什么,5 秒后肯定被服务器重置

如果你在客户端对服务器做了更新,他能同步到其他客户端(比如电商的库存数量)

2. 发送开始停止请求

	startTimer = (timerId) => {const now = Date.now();this.setState({timers: this.state.timers.map((t) => {if(t.id === timerId) {return Object.assign({}, t, {runningSince: now})}else{return t}})})client.startTimer({id: timerId,start: now})}stopTimer = (timerId) => {const now = Date.now();this.setState({timers: this.state.timers.map((t) => {if(t.id === timerId) {const lastElapsed = now - t.runningSince;return Object.assign({}, t, {elapsed: lastElapsed + t.elapsed,runningSince: null})}else{return t}})})client.stopTimer({id: timerId, stop: now})}

3. 发送创建、删除、更新请求

	createTimer = (timer) => {const t = helpers.newTimer(timer);this.setState({timers: this.state.timers.concat(t)})client.createTimer(t)}
	deleteTimer = (timerId) => {this.setState({timers: this.state.timers.filter(t => t.id !== timerId),})client.deleteTimer({id: timerId})}
	updateTimer = (attrs) => {this.setState({timers: this.state.timers.map((timer) => {if (timer.id === attrs.id) {return Object.assign({}, timer, {title: attrs.title,project: attrs.project})}else{return timer;}})})client.updateTimer(attrs)}

现在所有的操作都会持久化到服务器,并且在不同的选项卡中同步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二、MyBatis常用对象分析 封装工具类

1.0 MyBatis 对象分析 &#xff08;1&#xff09; Resources 类 Resources 类&#xff0c;顾名思义就是资源&#xff0c;用于读取资源文件。其有很多方法通过加载并解析资源文件&#xff0c;返回不同类型的 IO 流对象。 &#xff08;2&#xff09; SqlSessionFactoryBuilder…

iOS图片拉伸技巧

纵观移动市场&#xff0c;一款移动app&#xff0c;要想长期在移动市场立足&#xff0c;最起码要包含以下几个要素&#xff1a;实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后&#xff0c;少不了美工的辛苦设计&#xff0c;但如果开发人员不懂得怎么合理展示这些设…

LeetCode 2341. 数组能形成多少数对

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返…

三、MyBatis 使用传统 Dao 开发方式

1.0 使用 Dao 的实现类,操作数据库 1.0.1 Dao 开发 &#xff08;0&#xff09;定义接口StudentDao 及创建接口的映射文件StudentDao .xm package com.zep.dao;import com.zep.domain.Student;import java.util.List;public interface StudentDao {List<Student> selec…

LeetCode 2347. 最好的扑克手牌

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; "Flush"&#xff1a;同花&#xff0c;五…

四、MyBatis 框架 Dao 动态代理

1.1 步骤 &#xff08;1&#xff09; 去掉 之前编写的Dao 接口实现类 &#xff08;2&#xff09; getMapper 获取代理对象 只需调用 SqlSession 的 getMapper()方法&#xff0c;即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。 不使用工具类&…

五、深入理解Mybatis中的参数parameterType (传递一个简单参数,传递多个参数:@Param、使用自定义对象、按位置、使用Map)

1.1 parameterType parameterType: 接口中方法参数的类型&#xff0c; 类型的完全限定名或别名。这个属性是可选的&#xff0c;因为 MyBatis可以推断出具体传入语句的参数&#xff0c;默认值为未设置&#xff08;unset&#xff09;。接口中方法的参数从 java 代码传入到mapper…

六、封装 MyBatis 输出结果resultType、resultMap 以及 数据库表中列名和返回对象属性名不一致的2种解决方案(详解)

1.1 resultType resultType: 执行 sql 得到 ResultSet 转换的类型&#xff0c;使用类型的完全限定名或别名。 注意&#xff1a;如果返回的是集合&#xff0c;那应该设置为集合包含的类型&#xff0c;而不是集合本身。resultType 和 resultMap&#xff0c;不能同时使用。 A、…

API 接口批量测试

ApiPost 创建接口 导入要测试的数据 测试结果 ApiFox 创建接口 导入接口 导入测试数据&#xff0c;可以直接编辑&#xff0c;粘贴进来 测试结果

LeetCode 2342. 数位和相等数对的最大和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j &#xff…

软件项目管理-构建之法-四周总结

写在前面 课程名&#xff1a;软件项目管理 授课人&#xff1a;东北师范大学 杨贵福&#xff08; http://www.cnblogs.com/younggift/&#xff09; 教材&#xff1a;《构建之法 - 现代软件工程》 作者&#xff1a;邹欣老师 &#xff08;博客&#xff1a;http://www.cnblogs.com…

一、Vue基础语法学习笔记系列——插值操作(Mustache语法、v-once、v-html、v-text、v-pre、v-cloak)、绑定属性v-bind(绑定class、style)、计算属性

一、插值操作 1. Mustache 如何将data中的文本数据&#xff0c;插入到HTML中呢&#xff1f; 我们已经学习过了&#xff0c;可以通过Mustache语法(也就是双大括号)。 Mustache: 胡子/胡须. 我们可以像下面这样来使用&#xff0c;并且数据是响应式的 2. v-once 但是&#xff0…

LeetCode 2348. 全 0 子数组的数目

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;返回全部为 0 的 子数组 数目。 子数组 是一个数组中一段连续非空元素组成的序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,0,0,2,0,0,4] 输出&#xff1a;6 解释&#xff1a; 子数组 [0] 出现了…

二、Vue基础语法学习笔记——事件监听v-on、条件判断(v-if、v-else-if、v-else、v-show)、循环遍历(v-for遍历数组对象,key属性、检测数组更新)、图书案例、双向绑定

四、事件监听 在前端开发中&#xff0c;我们需要经常和用于交互。 这个时候&#xff0c;我们就必须监听用户发生的时间&#xff0c;比如点击、拖拽、键盘事件等等 在Vue中如何监听事件呢&#xff1f;使用v-on指令 v-on介绍 作用&#xff1a;绑定事件监听器 缩写&#xff1a; 预…

LeetCode 2352. 相等行列对

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 示…

三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

一、什么是组件化&#xff1f; 人面对复杂问题的处理方式&#xff1a; 任何一个人处理信息的逻辑能力都是有限的 所以&#xff0c;当面对一个非常复杂的问题时&#xff0c;我们不太可能一次性搞定一大堆的内容。 但是&#xff0c;我们人有一种天生的能力&#xff0c;就是将问题…

LeetCode 2353. 设计食物评分系统(sortedcontainers)

文章目录1. 题目2. 解题1. 题目 设计一个支持下述操作的食物评分系统&#xff1a; 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类&#xff1a; FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化…

四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽

一、父子组件的通信 在上一篇博文中&#xff0c;我们提到了子组件是不能引用父组件或者Vue实例的数据的。 但是&#xff0c;在开发中&#xff0c;往往一些数据确实需要从上层传递到下层&#xff1a; 比如在一个页面中&#xff0c;我们从服务器请求到了很多的数据。其中一部分数…

LeetCode 2336. 无限集中的最小数字(SortedSet)

文章目录1. 题目2. 解题1. 题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void ad…

C# - 类_使用新成员隐藏基类成员

1 using System;2 3 namespace 类_使用新成员隐藏基类成员4 {5 // 基类 : Animal6 public class Animal7 {8 // 基类的普通方法Eat(), 并未用Virtual修饰9 public void Eat() 10 { 11 Console.WriteLine("动物吃的方法: …