React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上

本文将展示如何在 ReactVue 中实现常见功能,从基础渲染到高级状态管理

Hello

分别使用 reactvue 写一个 Hello World!

react

tsx 复制代码
export default () => {
	return <div>Hello World!</div>;
}

vue

html 复制代码
<template>
  <div>Hello World!</div>
</template>

属性绑定

react

通过 {} 绑定属性

tsx 复制代码
export default () => {
  const url = "https://liuyuyang.net"
  return <a href={url}>跳转</a>;
}

vue

通过 : 绑定属性

html 复制代码
<script setup lang="ts">
const url = "https://liuyuyang.net"
</script>

<template>
  <!-- <a href="https://liuyuyang.net"></a> -->
  <a :href="url">跳转</a>
</template>

表达式

react

react 的表达式是单括号

tsx 复制代码
export default () => {
  const value = "Hello World!"
  const getValue = () => "Hello"
  const getImage = () => "https://liuyuyang.net"

  return (
    <>
      <div>{value}</div>
      <div>{true ? 'yes' : 'no'}</div>
      <div>{getValue()}</div>

      <img src={getImage() + '/1.jpg'} />
      <div style={{ background: true ? 'red' : 'blue' }}>{value}</div>
    </>
  )
}

vue

vue 的表达式是双括号

html 复制代码
<script setup lang="ts">
const value = "Hello World!"
const getValue = () => "Hello"
const getImage = () => "https://liuyuyang.net"
</script>

<template>
  <div>{{ value }}</div>
  <div>{{ true ? 'yes' : 'no' }}</div>
  <div>{{ getValue() }}</div>

  <img :src="getImage() + '/1.jpg'" />
  <div :style="{ background: true ? 'red' : 'blue' }">{{ value }}</div>
</template>

动态类名

react

react 定义类名的方式为 className

tsx 复制代码
export default () => {
  return <div className={`${true ? 'aaa' : 'bbb'}`}>Hello World!</div>
}

vue

vue 定义类名的方式为 class

html 复制代码
<script setup lang="ts">
</script>

<template>
  <div :class="`${true ? 'aaa' : 'bbb'}`">Hello World!</div>
  <div :class="{ aaa: true }">Hello World!</div>
  <div :class="{ 'aaa-bbb': true }">Hello World!</div>
</template>

条件渲染

react

react 大多数语法都比较偏向原生

tsx 复制代码
export default () => {
  const active = 1
  return (
    <>
      {
        active === 1
        ? <div>aaa</div>
        : active === 2
        ? <div>bbb</div>
        : <div>ccc</div>
      }
    </>
  )
}

vue

vue 可以使用 v-ifv-show 进行条件渲染

html 复制代码
<script setup lang="ts">
const active = 1
</script>

<template>
  <div v-if="active === 1">aaa</div>
  <div v-else-if="active === 2">bbb</div>
  <div v-else="true">ccc</div>
</template>

渲染数据

react

react 虽然有点语法写起来没有 vue 简单,但他的有点在于更加灵活、自由,非常受益于大型复杂的项目

tsx 复制代码
export default () => {
  const list = ['aaa', 'bbb', 'bbb']
  return (
    <ul>
      {
        list.map((item, index) => {
          return <li key={index}>{item}</li>
        })
      }
    </ul>
  )
}

vue

vue 使用 v-for 进行数据渲染

html 复制代码
<script setup lang="ts">
const list = ['aaa', 'bbb', 'bbb']
</script>

<template>
  <ul>
    <li v-for="(item, index) in list" :key="index">{{ item }}</li>
  </ul>
</template>

事件处理

react

reactonClick 需要的是一个函数

tsx 复制代码
export default () => {
  const func = () => alert("Hello World!")
  // return <button onClick={() => alert("Hello World!")}>点击弹框</button>;
  return <button onClick={func}>点击弹框</button>;
}

react 事件传参方式

tsx 复制代码
export default () => {
  const func = (msg: string) => {
    alert(msg)
  }
  
  return <button onClick={() => func('Hello World!')}>点击弹框</button>;
}

vue

vue@click 需要的是实例上已有的函数,比如在当前文件以及全局定义或内置的函数。因为 alert 不在实例上,因此不能直接 @click="alert('Hello World!')",但我们可以在当前文件定义一个函数,在函数里面使用 alert,然后调用这个函数

html 复制代码
<script setup lang="ts">
const func = () => {
  alert('Hello World!')
}
</script>

<template>
  <!-- <button v-on:click="func">点击弹框</button> -->
  <button @click="func">点击弹框</button>
</template>

vue 事件传参方式

html 复制代码
<script setup lang="ts">
const func = (msg: string) => {
  alert(msg)
}
</script>

<template>
  <button @click="func('Hello World!')">点击弹框</button>
</template>

状态处理

react

react 通过 useState 进行状态管理

tsx 复制代码
import { useState } from "react";

export default () => {
  const [count, setCount] = useState(0)

  return (
    <>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <div>{count}</div>
    </>
  );
}

vue

vue 通过 refreactive 进行状态管理

html 复制代码
<script setup lang="ts">
import { ref } from 'vue';
const count = ref(0)

// count.value = 100 在脚本中需要加.value,在模板中则不需要
</script>

<template>
  <button @click="count++">+1</button>
  <button @click="() => count++">+1</button>
  <div>{{ count }}</div>
</template>

表单处理

react

表单处理这一点个人感觉 react 要比 vue 麻烦些

tsx 复制代码
import { useState } from "react";

export default () => {
  const [value, setValue] = useState("")

  return (
    <>
      <input type="text" value={value} onChange={e => setValue(e.target.value)} />
      <div>{value}</div>
    </>
  );
}

vue

双向数据绑定,vue 的一大特性,这个语法糖非常好用

html 复制代码
<script setup lang="ts">
import { ref } from 'vue'
const value = ref("")
</script>

<template>
  <input type="text" v-model="value">
  <div>{{ value }}</div>
</template>

数据侦听

react

react 通过 useEffect 监听数据的变化

tsx 复制代码
import { useEffect, useState } from "react"

export default () => {
  const [count, setCount] = useState(0)

  useEffect(() => {
    console.log(count)
  }, [count])

  return <button onClick={() => setCount(count + 1)}>+1</button>
}

vue

vue 通过 watch 监听数据的变化

html 复制代码
<script setup lang="ts">
import { ref, watch } from 'vue';
const count = ref(0)

// watch(() => count.value, (newValue, oldValue) => { 
watch(count, (value) => { 
  console.log(value);
})
</script>

<template>
  <button @click="count++">+1</button>
</template>

计算属性

react

react 通过 useMemo 实现计算属性

tsx 复制代码
import { useMemo, useState } from "react"

export default () => {
  const [count, setCount] = useState(0)
  const newCount = useMemo(() => count * 2, [count])

  return (
    <>
      <h1>{count} {newCount}</h1>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </>
  )
}

vue

vue 通过 computed 实现计算属性

html 复制代码
<script setup lang="ts">
import { ref, computed } from 'vue';
const count = ref(0)
const newCount = computed(() => count.value * 2)
</script>

<template>
  <h1>{{ count }} {{ newCount }}</h1>
  <button @click="count++">+1</button>
</template>

下期内容

下一期内容为:组件、路由、全局状态管理、以及两种框架完成相同的 Demo

相关推荐
moonrailgun3 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
默_笙3 小时前
💫 给金鱼建图书馆(下):Milvus 向量数据库,让 AI 拥有长期记忆
前端·javascript
liangshanbo12154 小时前
手写 Function.prototype.call 与 Function.prototype.apply 面试题满分答案
开发语言·javascript·原型模式
CoderYanger5 小时前
前端基础——JavaScript(WebAPI)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
JunjunZ7 小时前
Naive UI 虚拟级联选择器适配 Element Plus 风格
前端·javascript·vue.js
光影少年8 小时前
如何实现RN 多环境、多渠道打包
前端·react native·react.js
闲坐含香咀翠8 小时前
百万行数据透视表,我是怎么把 Vue 响应式开销砍到零的
前端·vue.js·性能优化
用户302822530688 小时前
别让 Agent 被 Webhook 叫醒就开工:实现一个幂等启动层
javascript
许彰午9 小时前
34-安全复盘96个问题
前端·vue.js·安全
万少9 小时前
等不到 Apple 的折叠 iPhone,我用 DeepV4.1Flash + workBuddy 一句话自己造了一台
前端·javascript·后端