首页 > 其他分享 >初识vue3-setup语法糖,ref和reactive语法,computde计算属性,watch开启监听

初识vue3-setup语法糖,ref和reactive语法,computde计算属性,watch开启监听

时间:2023-03-25 17:56:59浏览次数:41  
标签:const name setup computde watch 语法 reactive user ref



vue3和vue2的区别

1,vue3首次渲染更快(Vue3在编译和渲染性能上有了很大的提升,主要是因为使用了Proxy代理和优化算法,使得组件可以更快的渲染)

2,diff算法更快

3,内存占用体积变得更小

4,打包体积变得更小

5,更好的ts支持(这里不是因为vue3是ts写的,所以更加支持ts,是因为Vue3对TS的支持更加完善了,包括更好的类型推断和类型定义)

6,Composition  API(vue3中引入了Composition API,他是一种新的组合式API,可以帮助我们更好的组织和复用逻辑代码,而不是像Vue2那样只能使用Options API)

vite和传统的webpack的区别

1,构建速度(vite的构建速度比webpack快很多,因为Vite使用了ES Modules来实现快速的热更新,也就是支持热加载。webpack则需要每次修改代码之后重新打包整个应用。这样每次保存看效果很麻烦)

2,开发体验(vite提供了一种更加流畅的开发体验,因为它可以在浏览器中直接运行代码,而不需要重新打包整个应用,开发很舒服)

3,配置(vite配置非常简单,因为它使用了约定优于配置的原则。相比之下webpack的配置比较复杂,需要花费一定时间学习配置)

4,插件生态(webpack插件生态比vite更加丰富,因为webpack存在时间,非常的长了。但是vite发展非常壮大)

webpack先打包然后启动服务器

vit会提供一个服务器,立即启动,然后打包,支持热更新,打包使用Rollup

使用vite创建vue3的项目

$ npm create vite@latest
$ yarn create vite
$ pnpm create vite

Project name: ... vite-dome1,项目名称

Select a framework: » Vue 创建名称

Select a variant: » JavaScript 使用语言

cd vite-dome1 //进入项目
npm i //装包
npm run dev //启动项目

type='module'绑定es6的代码和模板

 学习vue3语法

创建完成项目之后开始学习vue3的语法

setup函数

setup是vue3特有的选项,作为API的起点

从组件的生命周期来看,他在beforCreate之前执行,函数this不是组件实例,是undefined,如果数据或者函数在模板中使用,需要使用setup进行返回

<script>
import { ref } from 'vue'
export default {
  name: 'App',
  /**
   * 这里是组合式APi入口,比beforeCreate执行更早
   * vue3中没有this组件实例,所以在这里可以直接使用ref
   */
  setup() {
    const show = ref(true)
    const toggie = () => {
      show.value = !show.value
    }
    return { show, toggie }
  },
  beforeCreate() {
    console.log(`beforeCreate`)
  }
}
</script>
<template> <div> <button @click="toggie">点击显示或者隐藏图片</button> <hr> <img src="" alt="暂无图片" v-show="show"> </div> </template> <style scoped> </style>

setup语法糖

setup函数每次会有一个返回值,每次还要创建一个函数,太麻烦了,所以vue3提供了setup语法糖。

<script setup>
import { ref } from 'vue'
    const show = ref(true)
    const toggie = () => {
      show.value = !show.value
    }
</script>

<template>
  <div>
    <button @click="toggie">点击显示或者隐藏图片</button>
    <hr>
    <img src="" alt="暂无图片" v-show="show">
  </div>
</template>

<style scoped>

</style>

这样我们不需要定义setup函数,不需要返回值,不需要export default

ref函数--简单数据类型响应式

在setup函数中,使用ref函数,传入普通数据(简单or复杂)返回一个响应式数据

<script setup>
import { ref } from 'vue'
const num = ref(0)
const add = () => {
  num.value++
}
const obj = ref({
  name: 'zhangsan',
  age: 18
})
const change = () => {
  obj.value.name = 'lisi'
}
</script>

<template>
  <div>
    <h1>{{ num }}</h1>
    <button @click="add">add</button>
    <h1>{{ obj.name }}</h1>
    <button @click="change">change</button>
  </div>
</template>

<style scoped>

</style>

注意点:使用ref创建数据,js中的.value,template可以省略

reactive函数--复杂数据类型响应式

通常使用它定义对象类型的响应式数据

vue2中data函数中返回的对象数据是一个响应式数据,现在setup中返回的对象数据是响应式数据吗?

不是的,需要使用reactive进行转换

在setup函数中,使用reactive函数,传入一个普通对象,返回一个响应式数据对象,最后在setup函数中返回一个对象。

reactive函数通常定义:复杂数据类型,可以转换普通数据类型吗?不能

<script setup>
import {  reactive } from 'vue'
const state = reactive({
  name: `王路飞`,
  age: 18
})
const changeName = () => {
  state.name = `路飞`
}
// const name = reactive(`王路飞`) // reactive不能将基本类型转换为响应式数据
// const age = reactive(18)
// let changeName = () => {
//   name = `路飞` // 会报错,因为name是只读的
// }
</script>

<template>
<div>
  <h1>{{ state.name }}</h1>
  <h1>{{ state.age }}</h1>
  <button @click="changeName">改名</button>
</div>
</template>

<style scoped>

</style>

注意点:reactive不能转换普通数据类型为响应式数据

reactive和ref的选择

reactive可以转换对象成为响应式数据对象,但是不支持简单数据类型

ref可以转换简单数据类型为响应式数据对象,也可以支持复杂数据类型,但是操作的时候需要使用到.value

如果确定数据类型是对象,且字段和名称也确定,可以使用reactive转换成响应式数据,其他都使用ref,这样就没有心里负担

computed函数--计算属性

在setup函数中,使用computrd函数,传入一个函数,函数返回计算好的数据

最后setup函数返回一个对象,包含该计算属性数据即可,然后模板内使用

<script setup>
import { ref,computed } from 'vue'
const list = ref([1,2,3,4,5])
// 数据筛选出偶数
const even = computed(() => list.value.filter(n => n % 2 === 0))
// 当数据发生变化的时候
setTimeout(() => {
  list.value.push(6,9)
}, 2000)
</script>

<template>
<div>
  <h1>Vue3 Review</h1>
  <ul>
    <li v-for="item in list" :key="item">{{item}}</li>
  </ul>
  <ul>
    <li v-for="item in even" :key="item">{{item}}</li>
  </ul>
</div>
</template>

<style scoped>

</style>

watch函数--属性侦听器

watch属性侦听器监听数据的变化,使用watch监听一个响应式数据,使用watch监听多个响应式数据,使用watch监听响应式对象数据中一个属性(见到那数据类型),使用watch监听响应式对象数据中一个属性(复杂数据类型)配置深度监听,使用watch监听配置默认执行

使用watch监听一个响应式数据

<script setup>
import { ref,watch,reactive } from 'vue'
const count = ref(0)
// watch监听一个响应式
watch(count,(newVal,oldVal)=>{
  console.log(newVal,oldVal)
})
</script>

<template>
<div>
计数器:{{count}}
<button @click="count++">+</button>
</div>
</template>

<style scoped>

</style>

使用watch监听多个响应式数据

<script setup>
import { ref,watch,reactive } from 'vue'
// watch监听多个响应式
const user = reactive({
  name:`jack`,
  info:{
    age:18,
    gender:`男`
  }
})
// watch监听多个响应式
watch([user],()=>{
  console.log('改变')
  console.log(user.name)
})
</script>

<template>
<div>
名字:{{user.name}}
年龄:{{user.info.age}}
  <button @click="user.name = '路飞'">修改名称</button>
</div>
</template>

<style scoped>

</style>

使用watch监听对象的一个属性,简单数据类型

<script setup>
import { ref,watch,reactive } from 'vue'
const count = ref(0)
const user = reactive({
  name:`jack`,
  info:{
    age:18,
    gender:`男`
  }
})
// 监听对象一个属性,简单类型
watch(()=>user.name,()=>{
  console.log(user.name)
  console.log('user.name改变了')
})
</script>

<template>
<div>
名字:{{user.name}}
  <button @click="user.name = '黑胡子'">修改名称</button>
</div>
</template>

<style scoped>

</style>

使用watch监听对象一个属性,复杂数据类型

<script setup>
import { ref,watch,reactive } from 'vue'
const count = ref(0)
const user = reactive({
  name:`jack`,
  info:{
    age:18,
    gender:`男`
  }
})
// 监听对象一个属性,复杂类型
watch(()=>user.info.age,()=>{
  console.log(user.info.age)
  console.log('user.info.age改变了')
},{
  // 开启深度监听
  deep:true
})
</script>

<template>
<div>
  <button @click="user.info.age = 50">点击修改年龄</button>
</div>
</template>

<style scoped>

</style>

开启默认监听

<script setup>
import { ref,watch,reactive } from 'vue'
const count = ref(0)
const user = reactive({
  name:`jack`,
  info:{
    age:18,
    gender:`男`
  }
})
// 默认执行
watch (count,()=>{
  console.log('默认执行')
},{
  immediate:true
});
</script>

<template>
<div>
  计数器:{{count}}
<button @click="count++">+</button>
  <br>
名字:{{user.name}}
年龄:{{user.info.age}}
  <button @click="user.name = '路飞'">修改名称</button>
  <button @click="user.name = '黑胡子'">修改名称</button>
  <br>
  <button @click="user.info.age = 50">点击修改年龄</button>
</div>
</template>

<style scoped>

</style>

每次数据发生变动都会进行数据的劫持

标签:const,name,setup,computde,watch,语法,reactive,user,ref
From: https://www.cnblogs.com/hgng/p/17254584.html

相关文章

  • MongDB语法与快速入门
    一、MongDB简介1.概念 MongoDB是一个开源的文档型NoSQL数据库,它支持的数据模型是面向文档的,使用了类似JSON的BSON(二进制JSON)格式来存储数据,且提供了动态查询和索引功能......
  • asp.net core3.1使用EF Core出现:'OFFSET' 附近有语法错误。 在 FETCH 语句中选项 NEXT
    asp.netcore3.1使用EFCore3.1有毒efcore3.1遇到sqlserver2008'OFFSET'附近有语法错误。\r\n在FETCH语句中选项NEXT的用法无效。这就很烦,想加个EntityFrame......
  • 简介、程序结构、基本语法
    C简介​ C语言是一种通用的、面向过程式的计算机程序设计语言。1972年,为了移植与开发UNIX操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了C语言。UNIX操作系统,C......
  • Markdown语法学习
    Markdown学习标题:#+空格+标题名字二级标题##+空格+标题名字三级标题同理最多六级标题字体Hello,World!粗体:两边+**Hello,World!斜体:两边+*Hello,World!粗......
  • velocity简单的语法
    单行注释多行注释**sdxxz**#非解析内容:[[里面的内容不会被解析,包括一些特殊符号]]#变量引用:常规语法:$name正规语法:\({name}如果拿不到想用空串表示可......
  • 存储过程基本语法
    存储过程特定功能的的SQL指令进行封装编译之后存储在数据库服务器中客户端通过名字调用这个SQL指令集优点:防止SQL在网络中恶意修改无需客户端编写通过网络传送存......
  • 详解shell语法检查模式
    启用verbose调试模式在进入本指导的重点之前,让我们简要地探索下 verbose模式。它可以用-v调试选项来启用,它会告诉 shell 在读取时显示每行。要展示这个如何工作,下......
  • H.265编码协议---SPS语法解析
    一、背景  最近搞Intel平台的多路复用视频解码,发现某些视频会报解码不兼容参数的报错,分析MFX的源码(如下图所示),解码实例通过对比新旧的SPS部分参数来判断是否是相同的......
  • Markdown语法说明及测试一览表(转载)
    Markdown目录在文中放置[toc]Markdown标题在标题前放置1~6个#号一级标题二级标题三级标题四级标题五级标题六级标题Markdown段落格式常用通用部分......
  • .md文件格式详解,即markdown文件语法。记笔利器
    Markdown是一种轻量级的标记语言。Markdown虽然功能不是很强大,但是非常简单好用1、标题(#)标题(h1~h6标签)格式:#一级标题##二级标题###三级标题2、段落(空行)段落......