JSX

先介绍 React 唯一的一个语法糖:JSX。

理解 JSX 语法并不困难,简单记住一句话,遇到 {} 符号内部解析为 JS 代码,遇到成对的 <> 符号内部解析为 HTML 代码。

当你写下这个 React 组件时:

import React from 'react';

function MyComponent(props) {
return <div>{props.hello}</div>
}

最终会被自动工具翻译成:

import React from 'react';

function MyComponent(props) {
return React.createElement('div', null, props.hello);
}

React 就是通过这个小小语法糖,实现在 JS 里面写 HTML,可能有小伙伴会说 HTML 与 JS 分离不是更好吗?责职分明,混合只会更乱。但当你体验到代码自动提示,自动检查,以及调试时精确定位到一行代码的好处时,就清楚 React 和 Vue 的差距了。

文本插值

vue种采用双括号

<span>Message: {{ msg }}</span>

react采用单括号

function MyComponent(props) {
let msg = 'XXX'
return <div>{ msg }</div>
}

Attribute 绑定

vue中 想要响应式地绑定一个 attribute,应该使用 v-bind 指令

<div v-bind:id="dynamicId"></div>
<div :id="dynamicId"></div>

react中,使用单引号,或者使用单括号包裹表示动态绑定

function App () {
let tmpID = '12'
return (
<div className='App'>
<div id='12'>id</div>
<div id={tmpID}>id</div>
</div>
);
}

动态绑定多值:

function App () {
let tmpObject = {
id: 13,
className: 'wrapper'
}
return (
<div className='App'>
<div {...tmpObject}>id</div>
</div>
);
} 即: <div id="13" class="wrapper">id</div>

参数 Arguments

某些指令会需要一个“参数”,Vue在指令名后通过一个冒号隔开做标识。例如用 v-bind 指令

<a v-bind:href="url"> ... </a>

<!-- 简写 -->
<a :href="url"> ... </a>

React中则没有指令一说,而是采用如下方式:

// href跳转
function App () {
let tmpURL = 'https://www.XXXXXXXX'
return (
<div className='App'>
<a href={tmpURL}></a>
</div>
);
}

使用 JS 表达式

React 遇到 {} 符号内部解析为 JS 代码

function App () {
let tmpString = '--';
return (
<div className='App'>
<div >{1 + 1}</div>
<div >{'a' + 'b'}</div>
<div >{`1${tmpString}1`}</div>
</div>
);
}

即:

<div>2</div>
<div>ab</div>
<div>1--1</div>

事件处理

Vue中绑定事件处理:

<!-- `greet` 是上面定义过的方法名 -->
<button @click="greet">Greet</button>

React可以通过在组件中声明 事件处理 函数来响应事件

React中点击事件使用小驼峰形式:onClick

在标签上写函数:

function App () {
return (
<div className='App'>
<div onClick={() => alert('点击出现弹框')}>按钮</div>
</div>
);
}

提前声明函数:

function App () {
function myFun () {
alert('点击出现弹框')
}
return (
<div className='App'>
<div onClick={myFun}>按钮</div>
</div>
);
}

注意,onClick={handleClick} 的结尾没有小括号!不要 调用 事件处理函数:你只需 传递给事件 即可。当用户点击按钮时,React 会调用你的事件处理函数。

函数传参:

function App () {
function myFun (str) {
alert(str)
}
return (
<div className='App'>
<div onClick={() => myFun('点击出现弹框')}>按钮</div>
</div>
);
}

动态参数

Vue在指令参数上也可以使用一个 JavaScript 表达式,需要包含在一对方括号内:

<a v-bind:[attributeName]="url"> ... </a>

<!-- 简写 -->
<a :[attributeName]="url"> ... </a>

举例来说,如果你的组件实例有一个数据属性 attributeName,其值为 "href",那么这个绑定就等价于 v-bind:href

React 也可以通过动态参数绑定

function App () {
const obj = {
onClick: () => alert('点击出现弹框'),
// ...还可以写更多事件
}
return (
<div className='App'>
<div {...obj}>按钮</div>
</div>
);
}

修饰符 Modifiers

vue 修饰符是以点开头的特殊后缀

表明指令需要以一些特殊的方式被绑定。例如 .prevent 修饰符会告知 v-on 指令对触发的事件调用 event.preventDefault()

<form @submit.prevent="onSubmit">...</form>

React 则是依靠于JS基础

function App () {
function onSubmit(e){
e.preventDefault();
e.stopPropagation();
}
return (
<div className='App'>
<form onSubmit={onSubmit}>
<button type='submit'></button>
</form>
</div>
);
}

响应式

为了实现视图更新,VUE中响应式是一个重要的概念

而 React 中并没有响应式这个概念,要实现视图更新,需要在 React 引入 useState

通常,你会希望你的组件 “记住” 一些信息并展示出来。例如,也许你想计算一个按钮被点击的次数。要做到这一点,你需要在你的组件中添加 state

首先,从 React 引入 useState

import { useState } from 'react';

现在你可以在你的组件中声明一个 state 变量

function MyButton() {
const [count, setCount] = useState(0);
// ...

你将从 useState 中获得两样东西:当前的 state(count),以及用于更新它的函数(setCount)。你可以给它们起任何名字,但按照惯例,需要像这样 [something, setSomething] 为它们命名。

第一次显示按钮时,count 的值为 0,因为你把 0 传给了 useState()。当你想改变 state 时,调用 setCount() 并将新的值传递给它。点击该按钮计数器将递增:

function MyButton() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
} return (
<button onClick={handleClick}>
Clicked {count} times
</button>
);
}

React 将再次调用你的组件函数。这次,count 会变成 1。接着,变成 2。以此类推。

如果你多次渲染同一个组件,每个组件都会拥有自己的 state。你可以尝试点击不同的按钮:

计算属性

Vue中使用 watch 来实现计算属性(缓存计算的结果)

React 在组件的顶层调用 useMemo 来缓存每次重新渲染都需要计算的结果

import { useState } from 'react';
import { useMemo } from 'react'; function App () {
const [user] = useState({ firstname: 'a', lastname: 'b' }) const fullname = useMemo(() => {
return user.firstname + user.lastname;
}, [user.firstname, user.lastname]) return (
<div className='App'>
{fullname}
</div>
);
}

useMemo(calculateValue, dependencies)

参数

  • calculateValue:要缓存计算值的函数。它应该是一个没有任何参数的纯函数,并且可以返回任意类型。React 将会在首次渲染时调用该函数;在之后的渲染中,如果 dependencies 没有发生变化,React 将直接返回相同值。否则,将会再次调用 calculateValue 并返回最新结果,然后缓存该结果以便下次重复使用。
  • dependencies:所有在 calculateValue 函数中使用的响应式变量组成的数组。响应式变量包括 props、state 和所有你直接在组件中定义的变量和函数。如果你在代码检查工具中 配置了 React,它将会确保每一个响应式数据都被正确地定义为依赖项。依赖项数组的长度必须是固定的并且必须写成 [dep1, dep2, dep3] 这种形式。React 使用 Object.is 将每个依赖项与其之前的值进行比较。

绑定 HTML class

数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式。因为 classstyle 都是 attribute

Vue中可以给 :class (v-bind:class 的缩写) 传递一个对象来动态切换 class:

<div :class="{ active: isActive }"></div>

上面的语法表示 active 是否存在取决于数据属性 isActive 的真假值。

React实现方式基于js语法,其实有多种实现方式,列举三元运算符方式如下:

function App () {
let showColor = false
return (
// 现有box-show、box-hide两个class样式
<div className={showColor ? 'box-show' : 'box-hide'}></div>
);
}

语法糖转换

习惯 Vue 的同学都知道很多语法糖,比如 v-ifv-forv-bindv-on 等,相比 Vue,React 只有一个语法糖,那就是 jsx/tsx。v-if 这些功能在 React 上都是通过原生 javascript 实现的,慢慢你会发现,其实你学的不是 React,而是 Javascipt,React 赋予你通过 js 完整控制组件的能力,这部分明显比 Vue 的语法糖更加灵活,糖太多容易引来虫子(Bug)

条件渲染

vue 中写法是这样:

<div>
<h1 v-if="ishow">Vue is awesome!</h1>
<h1 v-else>else</h1>
</div>

在 React 函数组件中,只需使用 js 三目运算符语法即可完成条件渲染的功能。或者使用 && 逻辑,记住下面一句话就能过理解了:

遇到 {} 符号内部解析为 JS 代码,遇到成对的 <> 符号内部解析为 HTML 代码

function App () {
const ishow = false
return (
<div>
{ishow ? <div>awesome</div> : <div>else</div>}
{ishow && <h1>React!</h1>}
</div>
);
}

列表渲染

Vue中通过v-for进行列表渲染

React 通过 js 的数组语法 map,将数据对象映射为 DOM 对象。只需学会 js,无需记住各种指令,如果要做列表过滤,直接使用 items.filter(...).map(...) 链式调用即可,语法上更加灵活,如果为了提高渲染性能,使用 useMemo 进行优化即可,类似 Vue 的 computed。

function App () {
const arr = [{ message: 'react' }, { message: 'JS' }]
return (
<div>
{arr.map((items, index) => <li key={index}>{items.message}</li>)}
</div >
);
}

侦听器

Vue中使用 watch监听数据变化,触发回调

React中可以使用 useEffect 实现

function App () {
const [user, setUser] = useState({
firstname: 'a',
lastname: 'b'
})
useEffect(() => {
console.log("1111")
}, [user.firstname])
return (
<div>
<button onClick={() => setUser({ ...user, firstname: 'a2' })}></button>
</div >
);
}

致谢

感谢大佬iCheng的技术分享,本文转自iChengVue 转 React 指南 - iCheng

Vue前端开发 转 React 指南的更多相关文章

  1. vue前端开发那些事——后端接口.net core web api

    红花还得绿叶陪衬.vue前端开发离不开数据,这数据正来源于请求web api.为什么采用.net core web api呢?因为考虑到跨平台部署的问题.即使眼下部署到window平台,那以后也可以部 ...

  2. vue前端开发那些事——vue开发遇到的问题

    vue web开发并不是孤立的.它需要众多插件的配合以及其它js框架的支持.本篇想把vue web开发的一些问题,拿出来讨论下.  1.web界面采用哪个UI框架?项目中引用了layui框架.引入框架 ...

  3. vue前端开发那些事——vue组件开发

    vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...

  4. Vue前端开发规范(山东数漫江湖)

    一.强制 1. 组件名为多个单词 组件名应该始终是多个单词的,根组件 App 除外. 正例: export default { name: 'TodoItem', // ... } 反例: expor ...

  5. vue前端开发那些事——前言

    如上图所示,用vue开发一个小型网站所涉及到的知识点.这只是前端部分已经这么多了.接下来我分解开来说. 1.Node 当我们开发vue项目的时候,首先要安装Node.js,那么我们即使当时不理解为什么 ...

  6. vue前端开发那些事(1)

    如上图所示,用vue开发一个小型网站所涉及到的知识点.这只是前端部分已经这么多了.接下来我分解开来说. 1.Node 当我们开发vue项目的时候,首先要安装Node.js,那么我们即使当时不理解为什么 ...

  7. 《Vue前端开发手册》

    序言 为了统一前端的技术栈问题,技术开发二部规定开发技术必须以Vue为主. 为了更好的规范公司的前端框架,现以我前端架构师为主,编写以下开发规范,如有不当的地方,欢迎批评教育并慢慢改善该开发文档,谢谢 ...

  8. vue前端开发。。。

    1. 官网下载 https://nodejs.org/en/ 2. 安装cnpm   在命令行:  npm install -g cnpm --registry=https://registry.np ...

  9. 使用Vue-Cli搭建Ant Design Vue前端开发环境

    如果文章有帮助到你,还请点个赞或留下评论 搭建脚手架 环境准备 nodeJS vue-cli 如果没有安装点击此处查看安装方法 进入 vue ui 1.打开终端,输入命令 vue ui 2.选择项目存 ...

  10. 《Vue.js 2.x实践指南》 已出版

    <Vue.js 2.x实践指南>其实在一年前就已经完稿了,只是由于疫情的缘故耽搁了很久才下厂印刷.阅读本书需要具备HTML.CSS和JS基础,本书针对的用户群体主要是:想要快速学习vue技 ...

随机推荐

  1. python 更新pip镜像源

    前言 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢,下载速度是几kb或者几十kb,花费的时间比较长. 解决办法 国内目前有些机构或者公司整理了对应的镜像源,使得通过内网就能访问即可, ...

  2. 关于普通程序员该如何参与AI学习的三个建议以及自己的实践

    大部分程序员在学习大语言模型的时候都比较痛苦,感觉AI是如此之近又如此之远,仿佛能搞明白一点,又好像什么也没明白.就像我们在很远的地方看珠穆拉玛峰,感觉它就像一个不大的山包,感觉只要自己做足准备咬咬牙 ...

  3. Python设置递归最大深度

    博客地址:https://www.cnblogs.com/zylyehuo/ import sys sys.setrecursionlimit(100000) # 设置最大递归深度,默认是3000

  4. 一次Java后端服务间歇性响应慢的问题排查记录

    分享一个之前在公司内其它团队找到帮忙排查的一个后端服务连接超时问题,问题的表现是服务部署到线上后出现间歇性请求响应非常慢(大于10s),但是后端业务分析业务日志时却没有发现慢请求,另外由于服务容器li ...

  5. BUUCTF---old flashion

    1.题目 2.知识 3.解题 很奇怪,一段英文字母,看起来像维吉尼亚,但需要key,不知道什么是Key,我们丢到q爆破中试试 直接得出来了flag:flag{n1_2hen-d3_hu1-mi-ma_ ...

  6. 【UWB】DWM1000 室内定位串口协议说明

    UWB室内定位串口协议说明 通过串口发送的测距报告消息有三种: "mr"信息包括标签到锚定原始范围 "mc"标签到锚定范围偏差修正范围 - 用于标签位置 &qu ...

  7. cpp简单总结

    1.简述智能指针的特点,简述new和malloc的区别. shared_ptr,显现共享式特点,多个同类型的shared指针可以共享一个对象,当持有者的计数归0,shared_ptr指向的指针就会被释 ...

  8. 运维必备:基于 Harbor 的 Helm Charts 批量拉取,从配置到自动化脚本

    引言 在企业级 Kubernetes 环境中,Harbor 作为主流的镜像与 Helm Chart 管理工具,常被用于存储 Helm Charts.但在迁移.备份或离线部署场景中,批量拉取 Harbo ...

  9. Spring底层AOP代码实现

    一. AOP功能测试 ①. pom.xml 依赖导入 ②. 目标类 ③. 切面类 ④. 配置类 ⑤. 测试类 二. AOP原理-@EnableAspectJAutoProxy AOP原理:[看给容器中 ...

  10. Vue的前端项目开发环境搭建

    一.本机window端:安装Node.js,其实质性功能相当于,java的maven https://nodejs.org/en/download/ 二.本机window端:检查Node.js的版本 ...