苏州网站关键词优化,苏州互联网公司在哪个区,美容院网站制作,百度推广登陆平台原文#xff1a; https://icheng.github.io/2023/08/10/Vue%E8%BD%ACReact%E6%8C%87%E5%8D%97/
JSX
先介绍 React 唯一的一个语法糖#xff1a;JSX。
理解 JSX 语法并不困难#xff0c;简单记住一句话#xff0c;遇到 {} 符号内部解析为 JS 代码#xff0c;遇到成对的 …原文 https://icheng.github.io/2023/08/10/Vue%E8%BD%ACReact%E6%8C%87%E5%8D%97/
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种采用双括号
spanMessage: {{ msg }}/spanreact采用单括号
function MyComponent(props) {let msg XXXreturn div{ msg }/div
}Attribute 绑定
vue中 想要响应式地绑定一个 attribute应该使用 v-bind 指令
div v-bind:iddynamicId/div
div :iddynamicId/divreact中使用单引号或者使用单括号包裹表示动态绑定
function App () {let tmpID 12return (div classNameAppdiv id12id/divdiv id{tmpID}id/div/div);
}动态绑定多值
function App () {let tmpObject {id: 13,className: wrapper}return (div classNameAppdiv {...tmpObject}id/div/div);
}即div id13 classwrapperid/div参数 Arguments
某些指令会需要一个“参数”Vue在指令名后通过一个冒号隔开做标识。例如用 v-bind 指令
a v-bind:hrefurl ... /a!-- 简写 --
a :hrefurl ... /aReact中则没有指令一说而是采用如下方式
// href跳转
function App () {let tmpURL https://www.XXXXXXXXreturn (div classNameAppa href{tmpURL}/a/div);
}使用 JS 表达式
React 遇到 {} 符号内部解析为 JS 代码
function App () {let tmpString --;return (div classNameAppdiv {1 1}/divdiv {a b}/divdiv {1${tmpString}1}/div/div);
}即
div2/div
divab/div
div1--1/div事件处理
Vue中绑定事件处理
!-- greet 是上面定义过的方法名 --
button clickgreetGreet/buttonReact可以通过在组件中声明 事件处理 函数来响应事件
React中点击事件使用小驼峰形式onClick
在标签上写函数
function App () {return (div classNameAppdiv onClick{() alert(点击出现弹框)}按钮/div/div);
}提前声明函数
function App () {function myFun () {alert(点击出现弹框)}return (div classNameAppdiv onClick{myFun}按钮/div/div);
}注意onClick{handleClick} 的结尾没有小括号不要 调用 事件处理函数你只需 传递给事件 即可。当用户点击按钮时React 会调用你的事件处理函数。
函数传参
function App () {function myFun (str) {alert(str)}return (div classNameAppdiv 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 classNameAppdiv {...obj}按钮/div/div);
}修饰符 Modifiers
vue 修饰符是以点开头的特殊后缀
表明指令需要以一些特殊的方式被绑定。例如 .prevent 修饰符会告知 v-on 指令对触发的事件调用 event.preventDefault()
form submit.preventonSubmit.../formReact 则是依靠于JS基础
function App () {function onSubmit(e){e.preventDefault();e.stopPropagation();}return (div classNameAppform onSubmit{onSubmit}button typesubmit/button/form/div);
}响应式
为了实现视图更新VUE中响应式是一个重要的概念
而 React 中并没有响应式这个概念要实现视图更新需要在 React 引入 useState
通常你会希望你的组件 “记住” 一些信息并展示出来。例如也许你想计算一个按钮被点击的次数。要做到这一点你需要在你的组件中添加 state。
首先从 React 引入 useState
import { useState } from react;现在你可以在你的组件中声明一个 state 变量
function MyButton() {const [count, setCount] useState(0);// ...你将从 useState 中获得两样东西当前的 statecount以及用于更新它的函数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 classNameApp{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 列表和内联样式。因为 class 和 style 都是 attribute
Vue中可以给 :class (v-bind:class 的缩写) 传递一个对象来动态切换 class
div :class{ active: isActive }/div上面的语法表示 active 是否存在取决于数据属性 isActive 的真假值。
React实现方式基于js语法其实有多种实现方式列举三元运算符方式如下
function App () {let showColor falsereturn (// 现有box-show、box-hide两个class样式div className{showColor ? box-show : box-hide}/div);
}语法糖转换
习惯 Vue 的同学都知道很多语法糖比如 v-if、v-for、v-bind、v-on 等相比 VueReact 只有一个语法糖那就是 jsx/tsx。v-if 这些功能在 React 上都是通过原生 javascript 实现的慢慢你会发现其实你学的不是 React而是 JavasciptReact 赋予你通过 js 完整控制组件的能力这部分明显比 Vue 的语法糖更加灵活糖太多容易引来虫子Bug
条件渲染
vue 中写法是这样
divh1 v-ifishowVue is awesome!/h1h1 v-elseelse/h1
/div在 React 函数组件中只需使用 js 三目运算符语法即可完成条件渲染的功能。或者使用 逻辑记住下面一句话就能过理解了 遇到 {} 符号内部解析为 JS 代码遇到成对的 符号内部解析为 HTML 代码 function App () {const ishow falsereturn (div{ishow ? divawesome/div : divelse/div}{ishow h1React!/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 (divbutton onClick{() setUser({ ...user, firstname: a2 })}/button/div );
}
文章转载自: http://www.morning.kllzy.com.gov.cn.kllzy.com http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.wdhhz.cn.gov.cn.wdhhz.cn http://www.morning.drjll.cn.gov.cn.drjll.cn http://www.morning.qxltp.cn.gov.cn.qxltp.cn http://www.morning.dpsyr.cn.gov.cn.dpsyr.cn http://www.morning.bqfpm.cn.gov.cn.bqfpm.cn http://www.morning.gqnll.cn.gov.cn.gqnll.cn http://www.morning.rdnpg.cn.gov.cn.rdnpg.cn http://www.morning.hjjhjhj.com.gov.cn.hjjhjhj.com http://www.morning.nwjzc.cn.gov.cn.nwjzc.cn http://www.morning.pznqt.cn.gov.cn.pznqt.cn http://www.morning.mpflb.cn.gov.cn.mpflb.cn http://www.morning.fbdtd.cn.gov.cn.fbdtd.cn http://www.morning.saletj.com.gov.cn.saletj.com http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.wsxxq.cn.gov.cn.wsxxq.cn http://www.morning.cdrzw.cn.gov.cn.cdrzw.cn http://www.morning.inheatherskitchen.com.gov.cn.inheatherskitchen.com http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.xbckm.cn.gov.cn.xbckm.cn http://www.morning.lcxdm.cn.gov.cn.lcxdm.cn http://www.morning.zxqxx.cn.gov.cn.zxqxx.cn http://www.morning.bpmfg.cn.gov.cn.bpmfg.cn http://www.morning.bpncd.cn.gov.cn.bpncd.cn http://www.morning.rkjb.cn.gov.cn.rkjb.cn http://www.morning.yrgb.cn.gov.cn.yrgb.cn http://www.morning.wbllx.cn.gov.cn.wbllx.cn http://www.morning.sqhlx.cn.gov.cn.sqhlx.cn http://www.morning.ngdkn.cn.gov.cn.ngdkn.cn http://www.morning.cybch.cn.gov.cn.cybch.cn http://www.morning.rnngz.cn.gov.cn.rnngz.cn http://www.morning.gllgf.cn.gov.cn.gllgf.cn http://www.morning.rjyd.cn.gov.cn.rjyd.cn http://www.morning.wgkz.cn.gov.cn.wgkz.cn http://www.morning.jspnx.cn.gov.cn.jspnx.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.zrfwz.cn.gov.cn.zrfwz.cn http://www.morning.hpxxq.cn.gov.cn.hpxxq.cn http://www.morning.jfmjq.cn.gov.cn.jfmjq.cn http://www.morning.dhmll.cn.gov.cn.dhmll.cn http://www.morning.lktjj.cn.gov.cn.lktjj.cn http://www.morning.rjqtq.cn.gov.cn.rjqtq.cn http://www.morning.kngqd.cn.gov.cn.kngqd.cn http://www.morning.qglqb.cn.gov.cn.qglqb.cn http://www.morning.zpzys.cn.gov.cn.zpzys.cn http://www.morning.kqlrl.cn.gov.cn.kqlrl.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.mtzyr.cn.gov.cn.mtzyr.cn http://www.morning.mrcpy.cn.gov.cn.mrcpy.cn http://www.morning.knnc.cn.gov.cn.knnc.cn http://www.morning.hdrsr.cn.gov.cn.hdrsr.cn http://www.morning.bwnd.cn.gov.cn.bwnd.cn http://www.morning.tyjp.cn.gov.cn.tyjp.cn http://www.morning.mhwtq.cn.gov.cn.mhwtq.cn http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn http://www.morning.rrcxs.cn.gov.cn.rrcxs.cn http://www.morning.bbjw.cn.gov.cn.bbjw.cn http://www.morning.gzzxlp.com.gov.cn.gzzxlp.com http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn http://www.morning.nmymn.cn.gov.cn.nmymn.cn http://www.morning.qnkqk.cn.gov.cn.qnkqk.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.rtkz.cn.gov.cn.rtkz.cn http://www.morning.wfpmt.cn.gov.cn.wfpmt.cn http://www.morning.qwwhs.cn.gov.cn.qwwhs.cn http://www.morning.rbbgh.cn.gov.cn.rbbgh.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.fgppj.cn.gov.cn.fgppj.cn http://www.morning.ltffk.cn.gov.cn.ltffk.cn http://www.morning.rxrw.cn.gov.cn.rxrw.cn http://www.morning.gqhgl.cn.gov.cn.gqhgl.cn http://www.morning.byrlg.cn.gov.cn.byrlg.cn http://www.morning.lgwjh.cn.gov.cn.lgwjh.cn http://www.morning.ktmbp.cn.gov.cn.ktmbp.cn http://www.morning.mjzgg.cn.gov.cn.mjzgg.cn http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn