Vue3基本功能实现

这篇具有很好参考价值的文章主要介绍了Vue3基本功能实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue3 介绍

# Vue3的变化
# 1.性能的提升
	打包大小减少41%
    初次渲染快55%, 更新渲染快133%
    内存减少54%
    
# 2.源码的升级
	使用Proxy代替defineProperty实现响应式
    重写虚拟DOM的实现和Tree-Shaking
    
# 3.拥抱TypeScript
	Vue3可以更好的支持TypeScript
    
# 4.新的特性
	Composition API(组合API)
    setup配置
    ref与reactive
    watch与watchEffect
    provide与inject
    新的内置组件
        Fragment
        Teleport
        Suspense
        其他改变
    新的生命周期钩子
    data 选项应始终被声明为一个函数

组合式api和配置项api

# 组合式api
	都写到一个函数中,定义变量和定义方法,定义计算属性都是放在一起,不是拆到不同的地方
# 配置项api:之前vue2中的写法
	new Vue({
        data:{
            name:'lqz'
        },
        methods:{
            # 使用变量
        }
    })

Vue3之vue实例

# vue3的app实例
	也是个对象,但是以后我们使用东西,不是从this中拿了,this当没了
# vue2的app实例
	就是咱们再组件中用的this
    this.$store
    this.$refs....
    
# 以后真正的vue3的语法,写法可能变了

创建vue3项目

### vue3 完全兼容vue2 ###

# vue 3 项目创建有两种方式
	-vue-cli
    	-vue create vue_cli_test
        -路由选择,选择vue3即可
        -跟之前创建vue2是一样的
        
    -vite:vue_vute_test
    	npm init vue@latest
        按下图选择
        下载好之后 需要先npm install
        
# 工具链,构建工具
	-之前咱们再html中写,可能js可以引入
    -可能写了一些 es高版本的语法----》转成低版本
    -可能写  xx.vue,浏览器识别不了,浏览器只能识别:html,css,js
    -咱们需要 有个东西可以一次性把 es高版本转成低版本,把xx.vue 转成xx.js的方式
    -工具链:
    	webpack
        vite

![096376eab3015b61bde8616a0ec88c6](C:\Users\ADMINI~1\AppData\Local\Temp\WeChat Files\096376eab3015b61bde8616a0ec88c6.png)文章来源地址https://www.toymoban.com/news/detail-480325.html

setup

# setup是个函数 以后vue的代码 都写在这里面
	1.里面可以定义变量
    2.可以定义函数,可以定义匿名函数
    3.如果想在template中使用,必须return
    4.如果要对变量加入响应式,需要使用ref包裹变量
    5.data,methods都可以用,但是是setup函数先执行,才走其他
    6.template中使用函数,变量,都是优先用setup中的
    7.setup最先执行,是再生命周期的beforeCreate前执行的,内部没有this,也不能用this了

ref函数

// 包裹变量 实现响应式
let name = ref('xxx')

<template>
  <div class="home">
    名字是:{{ name }},年龄是:{{ age }},爱好:{{hobby}}
    <br>
    <button @click="handleAdd">点我涨年龄</button>
    <hr>
    <button @click="handleChange">点击变名字</button>
  </div>
</template>

<script>
// 导入ref函数
import {ref} from "vue";

export default {
  name: 'HomeView',
  // 这样写还是支持
  data() {
    return {
      // name: 'xxx',
      // age: 18,
      // hobby:'足球',
      hobby:this.name + '爱打篮球'
    }
  },
  methods: {
    handleAdd() {
      console.log('methods中的handleAdd')
    }
  },

  // 以后写成这个形式
  setup(){
    // 以后所有vue3的代码 都写在这里面
    // 原来写在data中定义变量
    // 如果想在view中使用定义的变量,必须return出去
    // var--老语法  let--以后定义变量用这个  const--定义常量

    // 1 定义变量,并再页面中渲染
    // let name = 'xxx'
    // let age = 19
    // return {name,age}

    // 2 定义变量和函数,在页面中使用----->失去了响应式
    // let name = 'xxx'
    // let age = 19
    // const handleAdd = ()=>{
    //   // alert('我被点了')
    //   age += 1
    //   console.log(age)
    // }
    // return {name,age,handleAdd}

    // 3 加入响应式
    // let name = ref('xxx')
    // let age = ref(18)  // 用ref包裹着就变成了响应式
    // const handleAdd = () => {
    //   console.log(age.value)
    //   // 以后需要用哪个值 就对象.value才能取出来
    //   age.value = age.value + 1
    // }
    // const handleChange = ()=>{
    //   name.value = 'zzz'
    //   // name.value = name.value + 'nb'
    //   console.log(name)
    // }
    // return {name,age,handleAdd,handleChange}

    // 研究一下,原来的data,methods还能不能用
    let name = 'xxx'
    let age = 19
    console.log('---',this)
    return {name,age}
  }
}
</script>

reactive函数

# 使用方式
let data = reactive({'name': 'xxx', 'age': 19, 'hobby': '篮球'})
const handelAdd = () => {
      data.age += 1  // 使用reactive包裹的对象,直接当对象用即可
      console.log(data)
    }
 return {data, handelAdd}

# 从定义数据角度对比:
	ref用来定义:基本数据类型
    reactive用来定义:对象(或数组)类型数据
# 从原理角度对比:
	ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)。
    reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。
# 从使用角度对比:
	ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value。
    reactive定义的数据:操作数据与读取数据:均不需要.value
<template>
  <div class="home">
    <h1>首页</h1>
<!--    名字是:{{name.value}}-->
    名字是:{{data.name}}-----年龄是:{{data.age}}
    <button @click="handleAdd">点我加年龄</button>
  </div>
</template>

<script>

import {ref,reactive} from "vue";

export default {
  name: 'HomeView',
  setup(){
    // 1 要让变量有响应式 要用ref包裹一下,包裹的都是字符串,数字,布尔
    // js中再使用这个变量取值赋值是要 变量名.value才能拿到
    // template中使用变量不要用 .value
    // let name = ref('xxx')
    // name.value = 'zzz'
    // return {name}

    // 2 如果想让对象有响应式 reactive
    let data = reactive({'name':'xxx','age':19,'hobby':'足球'})
    const handleAdd = () => {
      data.age += 1
    }
    return {data,handleAdd}
  }
}
</script>

计算、监听属性

### 监听属性 就是使用watch 三种方式
	# 1 方式一
    // 1.监听属性之监听普通属性
    // let name = ref('xxx')
    // const handleClick = () => {
    //   name.value = 'zzz'
    // }
    // // vue3的写法
    // watch(name,(newValue,oldValue)=>{
    //   console.log(oldValue)
    //   console.log(newValue)
    //   console.log('name 真的变了')
    // })
    
    # 2 监听属性之监听对象中的某个属性
    // let person = reactive({name:'xxx',age:19})
    // watch(()=>person.name,()=>{
    //   console.log('person中的name变了')
    // })
    // const handleClick = () => {
    //   person.name = 'zzz'
    // }
    // return {person,handleClick}

	# 3 同时监听多个变量
    let sum = ref(100)
    let msg = ref('很好')
    watch([sum,msg],(newValue,oldValue)=>{
      console.log('sum或msg变化了', newValue, oldValue)
    })
    const handleClick = () =>{
      sum.value = 200
    }
    return {sum,msg,handleClick}

### 计算属性 使用computed 只有取值触发或取值赋值触发函数
	# 1 基本使用
    // 1 原来写法照常使用
    // let name = ref('')
    // let newName = computed(()=>{
    //   return name.value + 'nb'
    // })
    // return {name,newName}

	#  2 了解:计算属性可以取值用,还可以改值
    let name = ref('')
    let newName = computed({
      get(){
        // 使用计算属性 会触发这里
        return name.value + '=nb'
      },
      set(value){
        // 只要计算属性发生变化 就会执行这里
        // 只要newName变了 name理应也变 需要我们写代码变
        let res = value.split('=')
        name.value = res[0]
        console.log('计算属性变了,变成',value)
      }
    })
    return {name,newName}

生命周期

# 8个生命周期钩子

# vue3不建议使用 配置项api 把所有代码都写在setup函数中
	以后没有:beforedestory和destory这俩了,换成了unmounted
    可以写配置项api
    	beforeCreate
        created
        beforeMoun
        mounted
        beforeUpdate
        updated 
        beforeUnmount 
        unmounted 
###  但是不建议了(以后写组合式aip)
    import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount, onUnmounted, reactive} from 'vue'
    	setup(){
        // 生命周期钩子
        // beforeCreate===>setup()
        // created=======>setup()
        // beforeMount ===>onBeforeMount
        // mounted=======>onMounted
        // beforeUpdate===>onBeforeUpdate
        // updated =======>onUpdated
        // beforeUnmount ==>onBeforeUnmount
        // unmounted =====>onUnmounted
        let t = setInterval(()=>{
          console.log('hello world')
        },3000)

        onBeforeUnmount(()=>{
          console.log('onBeforeUnmount')
          clearInterval(t)
          t = null
        })
        onUnmounted(()=>{
          console.log('onUnmounted')
        })
      }

toRef

// 创建一个 ref 对象,其value值指向另一个对象中的某个属性
	语法:const name = toRef(data,'name')
// toRefs与toRef功能一致 但是可以批量创建多个ref对象
	语法:toRefs(data)

// ...{对象}----》相当于解压
// 在setup函数中return时,使用return {...toRefs(data)},以后在template中直接使用内层的变量即可

import {toRefs} from "vue";

setup(){
    // let a = {hobby:'足球',gender:'男'}
    // let b = {...a,name:'zzz'}
    // let c = {...toRefs(a),name:'zzz'}
    // console.log(b) // {hobby: '足球', gender: '男', name: 'zzz'}
    // console.log(c) // {hobby: ObjectRefImpl, gender: ObjectRefImpl, name: 'zzz'}
    let data = reactive({name:'xxx',age:19})
    const handleClick = () => {
      alert('美女')
    }
    const handleAdd = () => {
      data.age += 1
    }
    // ...toRefs(data)  等同于  {name:data.name,age:data.age}
    // return {name: data.name, age: data.age, handleClick,handleAdd}
    return {...toRefs(data),handleClick,handleAdd}
  },

vue3 setup写法

<script setup>
// <script setup> 表示,这个script里的所有东西是setup函数,原来写在setup中的,现在顶格写即可
import {ref} from "vue";

let name = ref('xxx')
const handleClick = () => {
  name.value = 'zzz'
}
// watch,computed
// 生命周期钩子
// 组件导入,自动注册
// 不需要return
</script>

到了这里,关于Vue3基本功能实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue插件——relation-graph——实现关系图功能——技能提升

    在做组织关系图时,经常会遇到关系图的实现要求,就是要将人与人或者组织与组织或者人与组织之间的关系进行一一展示。已知的就是节点和关系。 最近在写后台管理系统时,遇到一个需求,就是要实现关系图: 如下图所示: 在前年写天眼查功能时,我也遇到过这种需求

    2024年02月11日
    浏览(43)
  • vue+antd——table组件实现动态列+表头下拉选择功能——技能提升

    展示行列数据。 当有大量结构化的数据需要展现时; 当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。 最近在写 vue+antd 的框架,遇到一个需求:就是要实现 table 表格的动态列,并且相应的表头要实现下拉选择的效果,最后点击保存时,要将下拉的内容拼接

    2024年02月09日
    浏览(56)
  • vue3监听路由的变化

    可以使用监听 router.currentRoute.value 的值,,来监听路由的变化。 引入: setup使用 : 控制台输出的值 newValue : 如果我们只需要监听当前路由 name 的变化,就可以这么监听 router.currentRoute.value.name immediate:true //true 就表示会立即执行。(watch默认绑定,页面首次加载时,是不会执行

    2024年02月12日
    浏览(44)
  • Vue3组件不发生变化,如何监听pinia中数据变化?

    在开发过程中,我们需要将一些跨组件使用的的数据在pinia中进行状态管理,组件在初始化的时候我们能通过onMounted,computed,watch,watchEffect获取到存储在pinia state中的内容,有一些特殊情况,在组件初始化之后我们无法通过以上四种情况获取state中的内容,这时候我们怎么做呢?

    2024年02月11日
    浏览(54)
  • Vue2 、vue3 监听对象的变化

    vue响应式也叫作数据双向绑定 MVVM模型 (Model-Viem-ViewModel) DOM listeners:实现了页面与数据的绑定,当页面操作数据的时候 DOM 和 Model 也会发生相应的变化 Data Bindings:  实现了数据与页面的绑定,当数据发生变化的时候会自动渲染页面 2.1  实现原理 vue实现数据响应式,是通过

    2024年02月04日
    浏览(50)
  • vue3 监听props 的变化

    再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age = age.value 传递一个ref的引用值 person props.person= person.value 传递一个reactive的引用值 person props.person= person 最开始时候,props指向了一个响应式的reactive pe

    2024年02月11日
    浏览(39)
  • vue3-模板中的变化

    vue2 比较让人诟病的一点就是提供了两种双向绑定: v-model 和 .sync ,在 vue3 中,去掉了 .sync 修饰符,只需要使用 v-model 进行双向绑定即可。 为了让 v-model 更好的针对多个属性进行双向绑定, vue3 作出了以下修改 当对自定义组件使用 v-model 指令时,绑定的属性名由原来的 va

    2024年02月12日
    浏览(52)
  • vue3问题:如何实现打印功能?

      编辑排版  | 宋大狮 平台运营  | 小唐狮 ONE 问题描述 2023年4月22号记,久违了大家。 今天要和大家分享的是关于如何实现表单、表格等自定义内容的打印功能。 最近在后台项目中,有遇到打印详情页的需求,因为开发中此功能用的次数不多,所以放在此处仅做一下记录

    2024年02月09日
    浏览(45)
  • Vue3 实现 clipboard 复制功能

    一个很小的交互功能,网上搜了一下有一个 vue3-clipboard 直接支持vue3,到github仓库看了下,原作者已经不维护这个项目了: 推荐使用 vueuse 自带的 useclipboard 功能,由 vue 团队维护,稳定性基本没问题 官网链接:useClipboard | VueUse 官网的例子如下: 上面的例子并不具备通用性,

    2024年02月06日
    浏览(41)
  • 19-vue2到vue3的一些变化

    Vue 2.x 有许多全局 API 和配置。 例如:注册全局组件、注册全局指令等。 Vue3.0中对这些API做出了调整: 将全局的API,即: Vue.xxx 调整到应用实例( app )上 2.x 全局 API( Vue ) 3.x 实例 API ( app ) Vue.config.xxxx app.config.xxxx Vue.config.productionTip 移除 Vue.component app.component Vue.directive

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包