从 Vue 的视角学 React(二)—— 基本语法
基于 Vue.js 开发的时候,每个 vue 文件都是一个单独的组件,可以包含 HTML,JS,CSS
而 React 是以函数为基础,每个 function 就是一个组件。虽然 JSX 让 HTML 的写法更加友好,但 CSS 还是需要另外引入
Vue 还给开发者提供了很多指令,而 React 中并没有,所以这片文章会介绍两者之间的常用语法差异
一、私有化 CSS
在 vue 文件中,可以直接通过 <style> 标签来写 CSS 样式
如果希望这些 CSS 仅对当前的 vue 文件生效,只需要在 <style> 标签中添加 scoped 属性
由于 React 是以 JSX 语法来编写代码,可以写行内样式,但不能添加 <style> 标签,所以通常是单独写一个 css 文件,然后直接在 JSX 中引入

// 需要提前安装 css-loader
但这种直接引入的 CSS 是全局生效的,如果只是针对当前组件的 CSS,可以通过 CSS Modules 来实现
将 CSS 文件重命名,添加一个 module 中间名,并且作为一个对象引入

然后以变量的形式添加 className。如果继续用之前字符串的形式引入,样式并不会生效

需要注意的是,由于 className 是以变量属性的方式引入,不支持短线连接,建议改为驼峰命名

这样一来,CSS 经过编译之后,每一个类都会生成一个哈希值,使这个类全局唯一,从而实现样式私有化
二、双向绑定
Vue 的特性之一就是双向绑定,而 React 是单向数据流,直接修改属性无法即时渲染到页面
需要在构造函数里面添加 state 状态

这里的 super() 是 ES6 提供的关键字,用于调用父类中的构造函数
React 中每一个需要用到 props 和 state 的组件都需要 super(props)
以便 React.Component 的构造函数可以初始化 this.props
如果需要修改 state 中的属性,需要使用 setState()

三、循环渲染
开发的时候经常会有基于数组渲染列表的需求,Vue 提供了 v-for 指令,而 JSX 中就需要借助数组的 map 函数
假设在 state 中定义了这么一个数组:

如果需要基于这个数组渲染一个列表,可以在 render() 函数中定义一个对象,用于循环渲染数组,最后将这个对象放到合适的位置

这里更好的做法是在 render() 之外创建一个函数,封装具体的遍历逻辑,然后返回一段 JSX
需要注意的是,和 Vue 的 v-for 指令类似,在使用 map 函数的时候,也需要给 DOM 节点添加一个 key
四、条件渲染
通过上面的代码可以看出,React 没有像 Vue 提供各种各样的语法糖,但所有需求都可以通过 JavaScript 本身语法来实现
所以 React 并不需要 v-if 这样的条件判断指令,直接用 if...else... 就能实现条件渲染


如果需要根据条件隐藏组件,只要让对应的函数返回 null 即可
五、DOM 操作
主流的前端框架都在倡导数据驱动,不过在实际业务中难免会有需要操作 DOM 的时候
在 Vue 项目中,可以通过 ref 为组件添加唯一 ID,从而获取到该组件实例,其中就包含了该组件的 DOM 对象
React 也有 ref 属性,功能和 Vue 中的 ref 相仿,不过具体的使用有些差异
首先需要通过 React.createRef() 在构造函数中创建一个 ref 对象

然后将这个对象挂到 render() 中的 DOM 元素或 class 组件上

另外还可以通过 React.forwardRef() 来转发 ref,通常在包装组件、开发高阶组件的时候会用到
主要用来透传某些 props,具体的使用可以参考官方文档
虽然 Vue 和 React 都提供了 ref,但官方并不推荐频繁使用
项目中用到 ref 的时候,更多的是用来处理一些特殊需求,比如获取 DOM 元素的坐标
如果需要用到 ref 来做数据处理或者页面渲染,通常也能通过 props、state、事件上报、状态提升等办法来实现同样的功能
在开发项目的时候,如果能花更多的时间来思考设计方案,而不是解决某个功能点,对项目、对个人都是非常有益的
参考资料:
《谈谈JavaScript中super(props)的重要性》
从 Vue 的视角学 React(二)—— 基本语法的更多相关文章
- 从 Vue 的视角学 React(四)—— 组件传参
组件化开发的时候,参数传递是非常关键的环节 哪些参数放在组件内部管理,哪些参数由父组件传入,哪些状态需要反馈给父组件,都需要在设计组件的时候想清楚 但实现这些交互的基础,是明白组件之间参数传递的方式, ...
- 从 Vue 的视角学 React(三)—— 事件处理
如果要处理某个元素的 click 事件,原生 js 可以直接为该元素添加一个 onclick 函数 Vue 封装了 v-on 指令,可以简化为 @click 并添加相应的函数 React 的开发思想是 ...
- 从 Vue 的视角学 React(一)—— 项目搭建
虽然 Vue 在国内一家独大,但在全球范围内,React 依然是最流行的前端框架 最近和一些朋友聊天,发现很多项目都选择了 React 技术栈,而且公司的新项目也决定使用 React 我一直以来都是走 ...
- Vue学习计划基础笔记(二) - 模板语法,计算属性,侦听器
模板语法.计算属性和侦听器 目标: 1.熟练使用vue的模板语法 2.理解计算属性与侦听器的用法以及应用场景 1. 模板语法 <div id="app"> <!- ...
- [Vue源码]一起来学Vue模板编译原理(二)-AST生成Render字符串
本文我们一起通过学习Vue模板编译原理(二)-AST生成Render字符串来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学V ...
- 小白学react之网页获取微信用户信息
通过上一篇<小白学react之EJS模版实战>我们学习了怎样通过EJS模版生成我们高定制化的index.html文件. 本篇我们将会继续延续我们的alt-tutorial项目的实战计划.去 ...
- 从零学React Native之13 持久化存储
数据持久化就是指应用程序将某些数据存储在手机存储空间中. 借助native存储 这种方式不言而喻,就是把内容传递给native层,通过原生API存储,详见从零学React Native之05混合开发 ...
- Vue+element搭建后台管理系统-二、安装插件
我们继续上一章的内容,上一章讲到我们已经能将项目成功跑起来了,那么我们接下来把项目必用的东西完善一下. 一.安装elementUI 终于到了我们的男二了,继续在VSCode中新建一个终端,然后通过这个 ...
- Mina、Netty、Twisted一起学(二):TCP消息边界问题及按行分割消息
在TCP连接开始到结束连接,之间可能会多次传输数据,也就是服务器和客户端之间可能会在连接过程中互相传输多条消息.理想状况是一方每发送一条消息,另一方就立即接收到一条,也就是一次write对应一次rea ...
随机推荐
- IComparable和IComparer接口
C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表 ...
- 移动端touch与click区别--移动端开发整理笔记(五)
移动端用touch还是click? 在移动端开发中,click事件有300ms的延时,由来源于iphone处理双击缩放功能种下的坑.因为用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器 ...
- Java中HTTP网络传输中文编码问题
Java中HTTP网络传输中文编码问题 1.java中new String(str.getBytes("utf-8"),"iso-8859-1")编码详解 前提 ...
- PDB files out of the debugger
我想我不需要强调在调试时拥有有效的PDB文件有多重要.通常,PDB文件是由调试器静默加载的,并且您很高兴在modules窗口中看到解析的所有符号.不幸的是,您还可能遇到调试器找不到匹配符号的情况.其原 ...
- 如何使用docker部署springcloud???
如何使用docker部署springcloud??? springcloud 必须基于 springboot 项目来开发, 这里讲解springboot项目的部署, springcloud项目也是同理 ...
- epoll及实现http多任务(python)
1.epoll用到了文件描述符的概念: 首先,操作系统中一切皆文件 文件与文件描述符fd 文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序使用这个"桥梁" ...
- HTML 超链接返回上一级
参考:http://blog.csdn.net/huanongjingchao/article/details/39587663 超链实现返回刚刚访问的网页: <a href="#&q ...
- 疯了!同事又问我为什么不能用 isXXX
最近在做Code Review,写下了这篇文章:代码写成这样,老夫无可奈何!,说多了都是泪啊.. 最近又有人同事跑过来质疑我: 为什么变量名取名不能用 isXXX 这种方式,这样有什么问题?! 醉了, ...
- Apache Beam实战指南 | 大数据管道(pipeline)设计及实践
Apache Beam实战指南 | 大数据管道(pipeline)设计及实践 mp.weixin.qq.com 策划 & 审校 | Natalie作者 | 张海涛编辑 | LindaAI 前 ...
- 【2019年06月28日】A股最便宜的股票
查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 经典价值三因子选股: 市盈率PE.市净率PB 和 股息分红率,按照 1:1:1的权重,选择前10大最便宜的股票. ...