React如何从后端获取数据并渲染到前端?

2023-10-28

React.js 自己的定位是“A JavaScript Library for building user interface”,它的文档称许多人将它用作 MVC 的 V。因此,React.js 不关心你是如何嵌入后端数据的。换句话说,我们怎么使用一个标准的 HTML 元素和后端打交道,就可以把同样的思路运用在 React.js 创造的组件上。

比如,一个 input,可以:

<input id="name" name="name" value="<?=$name?>">

的方式从 PHP 得到变量 $name

一个 React.js 组件也可以形如:

ReactDOM.render(React.createElement(HelloMessage, { name"<?=$name?>" }), mountNode);

用标准元素你可以用 AJAX 得到一个值然后(比如用 jQuery 去)操作:

$.ajax(...)
  .done(function(data){
    $('#name').val(data.name);
  });

用 React.js 时,同样可以在 AJAX 返回时使用你自己定义的方法去更新组件。

关于维护 JSON 信息麻烦的事情,怎么会呢?在 PHP 中 echo $var; 和 echo json_encode($var); 的麻烦程度是一个量级的。

ajax和json对于reactjs来说主要是表现形式不同,但最终都会变成js object,根据具体情况不同而选择。

比如我们建立一个用于筛选网站提供能够的服务项目(service)的页面,这个页面大概如下所示

class ServiceList extends React.Component{
    constructor(props){
        super(props)
        this.state={
            //我们使用state里面的services来保存所有的service
            //刚开始的时候,内容为空 
            services:[],
            //这里的view决定了我们要显示哪些service
            view:"type_a"
        }
    }
    
    render(){
        //当react库运行到render方法的时候,就会遍历所有state中service的项目
        const serviceShows = this.state.services.map((service,index)=>{
            //如果这个service的type和当前view相符,就把他添加到待显示内容的array中去
            if(service.type === this.state.view){
                return <div className="one-service" key={index}>{service}</div>
                //看到有说用index做为key是anti-pattern,这个我也没有过多研究
                //更好的方法肯定是用一些明确能代表数据的值,比如service.id这样会更好
                
                //但是有时候通过相同的index来欺骗react让他相信两个element是同一个element,又会有一些妙用
                //比如假如这里每个service会显示一个根据需要长度不同的label,css上面做一个transition效果
                //然后services分两批显示,即数量除以2,每次显示一半
                //如果使用不同的key,比如service.id,那么你会看到element不同的时候它们只是简单的被替换了
                //而如果总是使用每一批的index,那么你会看到label有一个动态的长度变换效果
                //因为react被我们欺骗了,label没有被替换,只是长度变化,所以css动画效果就生效了

            }
        })
        return(
            <div>
                {//这里,我们把待显示内容显示出来}
                {serviceShows}
            </div>
        )
    }
    
    //可以看到,我们的类被构造的时候本身自带的state中services是个空数组,我们需要用内容填充他
    //查看react的文档的《组件生命周期》这一页(这一页很重要,一定要明白各个函数在什么情况下会被触发),发现它建议我们在每个组件显示完毕
    //之后使用componentDidMount函数来获取需要的数据,那就照做
    componentDidMount(){
        //组件先按照services为空渲染一遍,你可以理解为先把网页框架渲染出来
        //渲染完毕之后就调用我们这里这个函数用ajax方法去服务器取数据
        const xhr = new XMLHttpRequest()
        //服务器随你喜欢,你可以用php,也可以用node,只要实现了标准的GET方法即可
        //对于post,put,delete等方法同理
        //而很显然,假如你的数据没有必要从数据库中提取,或者长期不变,也不怕泄密
        //那你完全可以在此请求一个json文件
        xhr.open("GET", "http://your.server.com/api/services", true)
        //根据情况选择是否要随get请求发送用于身份认证的信息
        xhr.withCredentials = true
        xhr.send()

        xhr.onreadystatechange = () =>{
            if(xhr.readyState == XMLHttpRequest.DONE){
                if(xhr.status == 200){
                    //你当然可以用其他方法编码你的返回信息,但是对于js的世界来说,还有什么比json更方便呢?
                    let gotServices = JSON.parse(xhr.responseText)
                    //好了,我们获得了service列表,使用setState方法覆盖当前元素的services数据
                    this.setState({
                        services : gotServices
                    })
                }
            }else{
                alert("ajax失败了")
            }
        }
    }
    
    //那么我们已经渲染了页面,也从服务器获得了数据,还把数据放到了应该放的位置,
    //还要做什么才能让我们写的这个component把新数据显示出来呢?
    //不用担心,react控制着所有的setState方法,
    //当他发现你对于某个component设置了新的state之后,他就会告诉那个component去再次执行render方法,
    //然后你再去看render方法,这次他因为this.state.services的内容不一样了自然就会渲染出不一样的内容啦
    //怎么样才能明显的感受到这一前一后两次渲染的存在呢?
    //在你的服务器端把刚才ajax请求的接口做个5秒钟的延迟,
    //你就会明显看到获得返回结果的那一瞬间新内容被刷出来啦
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React如何从后端获取数据并渲染到前端? 的相关文章

  • List转Map的三种方法

    for循环 import com google common base Function import com google common collect Maps import java util ArrayList import jav
  • 补 day10算法打卡

    232 用栈实现队列 代码 class MyQueue Stack
  • BugkuWeb:game1

    进去后发现是一款游戏 思路就是直接结束游戏 然后去看信息 发现网络监视器中多了score php 发现了可疑的参数score IP sign 这个sign应该在后台代码中被控制的 去审计代码 发现了sign的算法 这个游戏的得分是25 ba
  • 梦幻模拟战手游服务器维护,梦幻模拟战手游无法登陆游戏 服务器异常登录解决方法_游侠手游...

    梦幻模拟战手游 异常登录怎么办 无法登陆游戏怎么办 还没解决的玩家 下面小编就为玩家带来 梦幻模拟战手游 服务器异常登录无法登录解决方法 一起来看看吧 服务器异常登录无法登录解决方法 各位指挥官 真的非常抱歉 服务器目前不稳定 会有部分指挥
  • oracle 创建数据库 create database,使用create database语句创建数据库的详细操作步骤...

    使用create database语句创建数据库的步骤如下 1 指定一个实例标识符SID 2 确保设置了必要的环境变量 3 选择一个数据库管理员验证方法 4 创建一个初始化参数文件 5 只用于windows平台 创建一个实例 6 连接实例
  • 2022全国大学生数学建模竞赛C题思路模型

    1 比赛报名与思路解析 持续更新750967193 2 比赛时间 2022年9月15日18点到2022年9月18日20点 如下为C题思路 C 题 古代玻璃制品的成分分析与鉴别 丝绸之路是古代中西方文化交流的通道 其中玻璃是早期贸易往来的宝贵
  • Java异常, 性能有多差

    在 Java 中 异常通常被认为是成本昂贵的 不应该用于控制控制 本文将证明这个观点的正确性 并验证导致性能问题的原因 Java微基准测试框架 在编写代码评估Java异常的性能成本之前 我们需要搭建一个基准测试环境 测量异常的成本开销 并不
  • 04C++11多线程编程之创建多个线程和数据共享问题分析

    04C 11多线程编程之创建多个线程和数据共享问题分析 1 thread循环创建多个子线程 思想就是使用容器创建多个线程 推荐 以后工作中会使用到 具有实际意义 方便统一管理线程 include
  • Staple 跟踪: Complementary Learners for Real-Time Tracking

    目标跟踪算法 Staple Complementary Learners for Real Time Tracking 小小菜鸟一只 2017 03 25 09 26 42 15110 收藏 14 分类专栏 目标跟踪 版权 文章下载链接 文
  • 辨析Java与Javascript

    首先 它们是两个公司开发的不同的两个产品 Java是SUN公司推出的新一代面向对象的程序设计语言 特别适合于Internet应用程序开发 而JavaScript是Netscape公司的产品 其目的是为了扩展Netscape Navigato
  • 人才供应链(17年12月)

    库克来中国访问时说 高质量的人才是Apple公司最需要的 而苹果商店的开发者中 中国有200万开发者在支持应用商店 其中大部分是在广州 苹果的供应链也在中国 配套的零部件 面对高要求和近似到极限的品质要求 只有在中国才能满足 IT行业的人才
  • 压缩/减小VirtualBox虚拟硬盘文件占用空间

    文章目录 网上的做法 导出虚拟电脑 再导入 网上的做法 网上有两种压缩空间的做法 1 在虚拟机中 使用 SDelete 例如 sdelete c z 经本人实测 不仅不能压缩 因为SDelete 扫描了整个c 盘 而 VirtualBox
  • 【多模态】7、DINO

    文章目录 一 背景 二 方法 2 1 Contrastive DeNoising Training 2 3 Mixed Query Selection 2 4 Look Forward Twice 三 效果 论文 DINO DETR wit
  • 联想E450c下vmware安装ubuntu " Intel VT-x 处于禁用状态"

    实验环境 lenovo E450c 报错信息 解决办法 按F12进入BIOS 选择Security下的Virtualization 在Intel R 的行 设置Enabled 按F10保存 重新打开虚拟机 参考链接 vmware安装ubun
  • linux 挂载以及初始化硬盘

    linux 挂载以及初始化硬盘 简述 过多的赘述就不说了 一般使用linux完成一些像iscsi服务存储配置啥的 都需要用到硬盘的挂载来扩充服务器的存储空间 这里就简简单单给大家讲一下linux如何挂载初始化新的硬盘 我这里使用的是linu
  • CRC编码计算方法及C语言实现

    CRC编码计算方法及C语言实现 CRC Cyclic Redundancy Check 是一种常用的错误校验码 用于检测和纠正传输过程中的错误 在数据通信和存储中 CRC编码被广泛应用 因为它能够高效地检测错误 并且实现简便 CRC编码计算
  • V神·以太坊上的分片

    译者序 本文是我应以太坊中文社区 Ethfans org 之邀做的翻译稿 原文取自以太坊社区的Github https github com ethereum sharding blob develop docs doc md 原文最后更新
  • Flamingo

    基于已有的图像模型和文本模型构建多模态模型 最终模型的输入是图像 视频和文本 输出是文本 Vision encoder来自预训练的NormalizerFree ResNet NFNet 之后经过图文对比损失进一步学习 图片经过Vision
  • antd中Tabs切换控制其他地方的标签显隐(react)

    antd中Tabs切换控制其他地方的标签的显示与隐藏 过程如下 tab的回调函数 拿到key值之后就离成功不远了 然后在右边的标签下还有内容 也需要根据tab切换去控制显隐 和上面是一个道理 可以直接给里面的每个div类名 根据key值 去
  • Java写一个excel工具类_Java操作Excel工具类(poi)

    1 importorg apache commons lang3 exception ExceptionUtils 2 importorg apache poi hssf usermodel HSSFDataFormat 3 importo

随机推荐

  • STM32传感器外设集 -- 蓝牙(HC-05)+超声波(hc-sr04)

    前言 前言 蓝牙外设还没有给大家安排上 今天我就给大家安排上使用蓝牙传输超声波距离的例程 会给大家附带蓝牙的上位机的测试APP 一 模块介绍 1 连接图 蓝牙模块 引脚 超声波传感器 引脚 GND GND GND GND VCC 3 3 V
  • 基础IO(文件输入输出、标准IO接口、文件描述符和文件流指针)

    目录 基础IO 文件的输入输出操作 FILE fopen char filename char mode 文件名称 打开方式 size t fread char buf size t block size size t block coun
  • leetcode 1833 雪糕的最大数量 第一眼想到的是dp,其实只能排序加贪心

    夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪糕的现金价格 Tony 一共有 coins 现金可以用于消费 他想要买尽可能多的
  • ioctl()函数

    include
  • 前端js、javascript 鼠标 框选 文件 功能

    一 DEMO
  • No module named ‘torch‘

    系统环境 Win10 Python3 6 一 此处推荐第三种方法到官网获取相关安装指令 1 默认安装新版本torch pip install torch 2 安装指定版本torch pip install torch 1 7 0 二 安装t
  • PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers翻译

    摘要 在实时语义分割任务中 双分支网络架构具有良好得效率和有效性 然而 高分辨率细节和低频上下文的直接融合存在细节特征容易被周围上下文信息淹没的缺点 这种超调现象限制了现有双分支模型分割精度的提高 在本文中 我们将卷积神经网络 CNN 和比
  • Python脚本,使用apikey查询OpenAi可用余额

    脚本如下 import openai import os 设置 OpenAI API key openai api key os environ OPENAI API KEY def get balance 获取当前 OpenAI 可用余额
  • 软件工程作业创建表

    设计表 4 按专业统计课程数量 sql SELECT Major COUNT AS Num FROM Course GROUP BY Major 5 按专业查询所有课程信息 sql SELECT FROM Course WHERE Majo
  • vue实现电梯锚点导航

    1 目标效果 最近喝了不少的咖啡 奶茶 有一个效果我倒是挺好奇怎么实现的 1 点击左侧分类菜单 右侧滚动到该分类区域 2 右侧滑动屏幕 左侧显示当前所处的分类区域 这种功能会出现在商城项目中或者分类数量较多的项目中 专业名称称电梯导航 目标
  • 管道符丨用法

    使用管道操作符 可以把一个命令的标准输出传送到另一个命令的标准输入中 连续的 意味着第一个命令的输出为第二个命令的输入 第二个命令的输入为第一个命令的输出 依次类推 最常用的就是配合grep来使用 ps ef grep pycharm ps
  • MATLAB怎么保存数据到当前M文件所在文件夹

    之前写人脸识别的时候遇到如上问题 然后发现解决方案一 local address pwd 这样会返回当前工作目录的路径 local address被赋值为字符串 就是下图里 的下面这个位置 但是对任意文件夹里的M文件需要先设置当前工作目录的
  • juc辅助类

    目录 减少计数 CountDownLatch 循环栅栏 CyclicBarrier 减少计数 CountDownLatch 循环栅栏 CyclicBarrier 两者区别 信号灯 Semaphore juc辅助类有 减少计数 CountDo
  • Doxygen文档生成工具

    Doxygen代码文档生成工具 文章目录 Doxygen代码文档生成工具 Doxygen Doxygen的注释 vscode插件 Doxygen实际使用 Doxygen 根据百度百科说法 Doxygen是一种开源的 跨平台的文档系统 支持C
  • 记一次由于外部K8S集群证书到期导致Jenkins无法生成动态agent节点错误解决(入坑出坑)...

    欢迎关注 WeiyiGeek 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 涉及 网络安全运维 应用开发 物联网IOT 学习路径 个人感悟 等知识 花开堪折直须折 莫待无花空折枝 作者主
  • Flask虚拟环境

    一 虚拟环境 1 为什么需要虚拟环境 虚拟环境作用是将每个项目所需要的包隔离开形成一个独立的整体 每个虚拟环境互不干涉 方便与运行 因为如果有包有升级的话 可能会运行不了 2 安装使用虚拟环境 pipenv 2 1 安装虚拟环境 在系统命行
  • uview2.0自定义u-count-down倒计时

    1 效果展示 2 思路需要后端返回一个结束的时间戳 注意是毫秒时间戳 如果是秒需要在后面加3个0转为毫秒 获取当当前时间戳 当前时间戳减去商品结束的时间戳得出要倒计时的时间戳 然后再进行值得处理 3 代码展示
  • 分享一个放烟花的特效

    先看效果 再看代码
  • 如何mock系统调用

    背景 Linux下开发存储系统 网络库的时候会用到一系列Linux的系统调用 每一个系统调用都有一些出错的场景 有些场景很极端 比如内存使用达到上限 磁盘写满等 如果对其进行测试的话 很难去构造这样的一个场景 这个时候集成测试就显得力不存心
  • React如何从后端获取数据并渲染到前端?

    React js 自己的定位是 A JavaScript Library for building user interface 它的文档称许多人将它用作 MVC 的 V 因此 React js 不关心你是如何嵌入后端数据的 换句话说 我们