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

相关推荐
customer0819 分钟前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
乐多_L35 分钟前
使用vue3框架vue-next-admin导出表格excel(带图片)
前端·javascript·vue.js
初尘屿风1 小时前
基于微信小程序的电影院订票选座系统的设计与实现,SSM+Vue+毕业论文+开题报告+任务书+指导搭建视频
vue.js·微信小程序·小程序
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS打卡健康评测系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
纯粹要努力1 小时前
前端跨域问题及解决方案
前端·javascript·面试
小刘不知道叫啥1 小时前
React源码揭秘 | 启动入口
前端·react.js·前端框架
合法的咸鱼1 小时前
uniapp 使用unplugin-auto-import 后, vue文件报红问题
前端·vue.js·uni-app
csdn_aspnet2 小时前
JavaScript AJAX 库
javascript·ajax
胡桃不是夹子2 小时前
vue登陆下拉菜单
前端·javascript·vue.js
大G哥2 小时前
用DeepSeek来帮助学习three.js加载3D太极模形
开发语言·前端·javascript·学习·ecmascript