vue3技术简易入门剖析(二)

简介: vue3技术简易入门剖析(二)

vue3技术简易入门剖析(一)https://developer.aliyun.com/article/1432712


四、vue3中的响应式原理

4.1 vue2中的响应式原理

通过 Object.defineProperty() 方法来实现。通过gettersetter方法来完成。

Object.defineProperty(obj,'属性',{
  get(){},set(){}
})

4.2 vue3的响应式原理

ref() ===> reactive()

通过Es6中的 proxy 代理来完成的。

4.2.1 回顾ES6中proxy的使用
<body>
    <script type="text/javascript">
      let obj = {
        name:'张三',
        age:18,
        address:'郑州'
      }
      let p = new Proxy(obj,{
        //target表示 被代理对象  propKey表示读取的属性值
        get(target,propKey){
          console.log(`获取了${propKey}属性`)
          return target[propKey]
        },
        set(target,propKey,value){
          console.log(`修改了${propKey}属性`)
          target[propKey] = value
        },
        deleteProperty(target,propKey){
          console.log(`删除了${propKey}属性`)
          return delete target[propKey]
        }
      })
    </script>
  </body>
</html>
获取属性调用get()方法
修改或者新增属性调用set()方法
删除属性调用deleteProperty()方法
4.2.2 ES6 中的 Reflect 反射

反射:获取对象中的属性值

概念: 见教程:https://es6.ruanyifeng.com/#docs/reflect

**使用:**Reflect是与Proxy 完全对应的方法,我们可以通过Proxy代理对 对象的操作添加一些拦截 做一些事情,同时可以使用Reflect反射 来从对象中获取数据。主要用途:封装底层框架,保证代码顺利执行

<body>
    <script type="text/javascript">
      let obj = {
        name:'张三',
        age:18,
        address:'郑州'
      }
      let p = new Proxy(obj,{
        //target表示 被代理对象  propKey表示读取的属性值
        get(target,propKey){
          console.log(`获取了${propKey}属性`)
          return Reflect.get(target,propKey)
        },
        set(target,propKey,value){
          console.log(`修改了${propKey}属性`)
          Reflect.set(target,propKey,value)
        },
        deleteProperty(target,propKey){
          console.log(`删除了${propKey}属性`)
          return Reflect.deleteProperty(target,propKey)
        }
      })
    </script>
  </body>
</html>

五、computed计算属性

仍然可以按照vue2中的语法来实现计算属性。

但是这里我们推荐使用vue3

  • 首先引入computed
import {computed} from 'vue'
  • 在setup中定义计算属性
<template>
  <input v-model="msg"/>
  <p>转为大写:{{newVal}}</p>
</template>
<script>
  import {ref,computed} from 'vue'
  export default{
    setup(){
      let msg = ref('')
      //定义计算属性
      let newVal = computed(()=>{
        return msg.value.toUpperCase()
      })
      return {msg,newVal}
    }
  }
</script>

六、watch侦听器

首先:vue2中侦听器的使用方式在vue3中仍然可以使用

6.1 watch侦听

vue3的方式定义侦听器:

语法格式:

import {watch} from 'vue'
export default{
    watch(被监视的数据,监视的回调函数),
     watch(name,(newVal,oldVal)=>{})
}

案例:

<template>
  <!-- vue3中的侦听器 -->
  <h1>数量:{{count}}</h1>
  <button type="button" @click='count++'>点我+1</button>
  <h1>数量:{{num}}</h1>
  <button type="button" @click='num+=2'>点我+2</button>
  <h1>===========================reactive数据监听====================================</h1>
  <h1>姓名:{{obj.name}}</h1>
  <button type="button" @click='obj.name+="#"'>点我改变名字</button>
  <h1>年龄:{{obj.age}}</h1>
  <button type="button" @click='obj.age+=1'>点我改变年龄</button>
  <h1>班级:{{obj.class.c1}}</h1>
  <button type="button" @click='obj.class.c1+="--"'>点我改变班级</button>
</template>
<script>
  import {ref,reactive,watch} from 'vue'
  export default{
    setup(){
      let count = ref(0)
      let num = ref(10)
      let obj = reactive({
        name:'张三',
        age:18,
        address:'郑州',
        class:{
          c1:'qy147',
          c2:'qy148'
        }
      })
      //监视一个数据
      /* watch(count,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
      }) */
      //监听多个数据  此时的newVal,oldVal 都是以数组形式展示数据
      /* watch([count,num],(newVal,oldVal)=>{
        console.log(newVal,oldVal)
      }) */
      //监听reactive对象数据
      //注意:此处可以监听到数据的改变,但是无法获取到oldVal
      //reactive响应式数据的监听,vue3会自动开启深度监听 并且是强制开启的 deep配置没有效果
      /* watch(obj,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
      },{immediate:true}) */
      //监听对象中单独的属性
      //注意:需要把要监听的属性以函数的形式返回 才可以监视到
      //此时的oldVal也可以使用
      /* watch(()=>obj.class.c1,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
      },{immediate:true}) */
      //此时直接监听class对象  此时需要开启 deep:true属性
      watch(()=>obj.class,(newVal,oldVal)=>{
        console.log(newVal,oldVal)
      },{immediate:true,deep:true})
      return {count,num,obj}
    }
  }
</script>

6.2 watchEffect 侦听

**简介:**立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。也就是说监视的回调函数中用到了哪个属性,那么当这个属性发生改变时,watchEffect回调就会执行。

watchEffect(()=>{
    num.value+=1
    console.log('watchEffect执行了')
})

只要num的值 发生了改变 watchEffect中的回调函数就会执行。

七、vue3内置组件

7.1 Fragment组件

概念:Fragment就是一个虚拟的元素,vue3中元素不必使用根元素包括,其实就是放在一个Fragment虚拟元素中了。


7.2 Teleport组件 传送门

**简介:**Vue 鼓励我们通过将 UI 和相关行为封装到组件中来构建 UI。我们可以将它们嵌套在另一个内部,以构建一个组成应用程序 UI 的树。

然而,有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app 之外的其他位置。

一个常见的场景是创建一个包含全屏模式的组件。在大多数情况下,你希望模态框的逻辑存在于组件中,但是模态框的快速定位就很难通过 CSS 来解决,或者需要更改组件组合。

语法格式:

<teleport to="#Father"></teleport>
通过to属性指定要传送的位置。to属性的值: 可以是html标签名  也可以是标签的id值

官方案例: 点击按钮 打开弹出框,teleport内置组件可以让弹出框显示在指定的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZjdmYW1-1655452084601)(assets/image-20220309110532944.png)]

Father.vue组件:

<template>
  <div id="Father">
    <h1>这里是父组件</h1>
    <Son></Son>
  </div>
</template>
<script>
  import Son from './Son.vue'
  export default{
    components:{Son}
  }
</script>
<style scoped>
  #Father{
    border:1px solid red;
    background-color: red;
    line-height: 100px;
  }
</style>

Son.vue组件

<template>
  <div id="son">
    <h1>这里是儿子组件</h1>
    <Child></Child>
    <button type="button" @click='isShow=true'>打开弹窗</button>
    <Dialog v-if="isShow" @closeDialog='bbb'></Dialog>
  </div>
</template>
<script>
  import Child from './Child.vue'
  import Dialog from './Dialog.vue'
  import {ref} from 'vue'
  export default{
    components:{Child,Dialog},
    //emits:['closeDialog'],
    setup(props,context){
      let isShow = ref(false)
      function bbb(val){
        isShow.value = val
      }
      return {isShow,bbb}
    }
  }
</script>
<style scoped>
  #son{
    border:1px solid red;
    background-color: gray;
    line-height: 100px;
  }
</style>

Child.vue组件

<template>
  <div id="child">
    <h1>这里是孙子组件</h1>
    <button type="button" @click='isShow=true'>打开弹窗</button>
    <Dialog v-if="isShow" @closeDialog='bbb'></Dialog>
  </div>
</template>
<script>
  import Dialog from './Dialog.vue'
  import {ref} from 'vue'
  export default{
    components:{Dialog},
    //emits:['closeDialog'],
    setup(){
      let isShow = ref(false)
      function bbb(val){
        isShow.value = val
      }
      return {isShow,bbb}
    }
  }
</script>
<style scoped>
  #child{
    border:1px solid red;
    background-color: blue;
    line-height: 100px;
    color: white;
  }
</style>

Dialog.vue组件:

<template>
  <teleport to="#Father">
    <div id="dialog">
      <div class="dialog">
        <h2>这里是弹出层组件</h2>
        <h3>你好啊哈哈哈</h3>
        <button type="button" @click="close">点我关闭</button>
      </div>
    </div>
  </teleport>
</template>
<script>
  import {ref} from 'vue'
  export default{
    emits:['closeDialog'],
    setup(props,context){
      let isShow = ref(true)
      function close(){
        context.emit('closeDialog',false)
      }
      return{isShow,close}
    }
  }
</script>
<style scoped>
  #dialog{
    background-color: rgba(0,0,0,0.5);
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
  }
  .dialog{
    width: 300px;
    height: 300px;
    background-color: yellow;
    margin: auto;
    margin-top: 200px;
  }
</style>

完成效果:让dialog弹出层 能够显示在teleport的to属性指定的位置。

7.3 Suspense组件


vue3技术简易入门剖析(三)https://developer.aliyun.com/article/1432714


目录
相关文章
|
4月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
715 5
|
1月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
217 1
|
1月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
133 0
|
2月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
85 0
|
4月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
391 17
|
5月前
|
JavaScript 前端开发 算法
Vue 3 和 Vue 2 的区别及优点
Vue 3 和 Vue 2 的区别及优点
|
5月前
|
存储 JavaScript 前端开发
基于 ant-design-vue 和 Vue 3 封装的功能强大的表格组件
VTable 是一个基于 ant-design-vue 和 Vue 3 的多功能表格组件,支持列自定义、排序、本地化存储、行选择等功能。它继承了 Ant-Design-Vue Table 的所有特性并加以扩展,提供开箱即用的高性能体验。示例包括基础表格、可选择表格和自定义列渲染等。
376 6
|
4月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
1467 0
|
6月前
|
JavaScript 前端开发 UED
vue2和vue3的响应式原理有何不同?
大家好,我是V哥。本文详细对比了Vue 2与Vue 3的响应式原理:Vue 2基于`Object.defineProperty()`,适合小型项目但存在性能瓶颈;Vue 3采用`Proxy`,大幅优化初始化、更新性能及内存占用,更高效稳定。此外,我建议前端开发者关注鸿蒙趋势,2025年将是国产化替代关键期,推荐《鸿蒙 HarmonyOS 开发之路》卷1助你入行。老项目用Vue 2?不妨升级到Vue 3,提升用户体验!关注V哥爱编程,全栈开发轻松上手。
416 2
|
6月前
|
JavaScript 前端开发 算法
高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图
mermaid是一款非常优秀的基于 JavaScript 的图表绘制工具,可渲染 Markdown 启发的文本定义以动态创建和修改图表。非常适合新手学习或者做一些弱交互且自定义要求不高的图表 除了流程图以外,mermaid还支持序列图、类图、状态图、实体关系图等图表可供探索。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~