【Vue3从零开始-第六章】6-8 compositionAPI中的生命周期函数、provide和inject、模板中的ref

简介: 【Vue3从零开始-第六章】6-8 compositionAPI中的生命周期函数、provide和inject、模板中的ref

]UWOD(KIB9LJS9~S[T{QHM9.png


前言


上一篇的文章中,我们一起学习了compositionAPI中的watch和watchEffect的使用和区别,本篇文章中我们将一起学习compositionAPI中最后的一部分内容:生命周期函数、provide、inject、模板中的ref


生命周期函数


👆 【vue3从零开始】基础知识篇里面我们也有学习过生命周期函数,但是在compositionAPI中也给我们提供了类似的生命周期函数。


👉 在compositionAPI中的生命周期函数会与基础知识篇里面的有些许不同,有新增也有删减。


<script>
  const app = Vue.createApp({
    setup() {
      const {ref, onBeforeMount, onMounted, onBeforeUpdate, onUpdated} = Vue
      const message = ref('Hello World')
      onBeforeMount(() => {
        console.log('onBeforeMount')
      })
      onMounted(() => {
        console.log('onMounted')
      })
      onBeforeUpdate(() => {
        console.log('onBeforeUpdate')
      })
      onUpdated(() => {
        console.log('onUpdated')
      })
      const handleClick = () => {
        message.value = 'Hello JueJin'
      }
      return {message, handleClick}
    },
    template: `
      <div>
        <span @click="handleClick">{{message}}</span>
      </div>
    `
  });
  const vm = app.mount('#root');
</script>
复制代码


  • compositionAPI中,生命周期函数也需要单独从Vue中解构出来使用。


  • onBeforeMount函数类似于基础篇中的beforeMount函数


  • onMounted函数类似于基础篇中的mounted函数


  • 以此类推,其他基础篇中的生命周期函数也只是在加了一个on前缀。


  • 还有beforeUnmountunmouted函数大家可以自己试试哦~


79I$2{O3V8_~9PM]%9ID%KN.png


由于setup函数的特性,setup函数执行时间是在beforeCreate函数created函数之间,这两个生命周期函数中需要执行的东西直接写在setup函数中就可以了,所以在compositionAPI中是没有beforeCreate函数created函数的。


除了基础篇的部分生命周期函数之外,compositionAPI中还新增了两个生命周期函数:onRenderTrackedonRenderTriggered


const {onRenderTracked, onRenderTriggered} = Vue
onRenderTracked(() => {
    console.log('onRenderTracked')
})
onRenderTriggered(() => {
    console.log('onRenderTriggered')
})
复制代码


  • onRenderTracked函数表示每次渲染后重新收集响应式依赖。


  • onRenderTriggered函数表示每次触发页面重新渲染时自动执行。


{5Y{C[}@H5~[DOWSN2IT~8M.png


provide和inject


👆 在基础知识篇中,我们也一起学习过provide和inject的使用方法,主要就是组件和组件之间传递参数时使用的,可以跨组件去传参。


👉 在compositionAPI中也可以通过provide和inject方法去给组件传递参数。


const app = Vue.createApp({
    setup() {
      const {ref, provide} = Vue
      const message = ref('Hello World')
      provide('message', message)
      return { }
    },
    template: `
      <div>
        <child />
      </div>
    `
  });
复制代码


  • 首先我们在根组件中使用provide方法,在provide方法里面是一个key、value的方式赋值的。


app.component('child', {
    setup(){
      const {inject} = Vue
      const message = inject('message')
      return {message}
    },
    template: `
      <div>
        <span>{{message}}</span>
      </div>
    `
  })
复制代码


  • 然后我们在定义一个子组件,子组件中通过inject方法去接收根组件传递过来的值,并return给外部。


GUNVA88%T1MC}S28N8K%JKY.png


✍ 由于vue的特性原因,父组件传递给子组件的数据,在子组件中是不允许直接修改的,想要修改的话,必须调用父组件的方法,在父组件中去修改传递过来的数据值。


app.component('child', {
    setup(){
      const {inject} = Vue
      const message = inject('message')
      const handleClick = () => {
        message.value = 'Hello JueJin'
      }
      return {message, handleClick}
    },
    template: `
      <div>
        <span @click="handleClick">{{message}}</span>
      </div>
    `
  })
复制代码


YI6A_%$PL31JDSSQ9[W7L~I.png


👋 但是在compositionAPI中传递的数据,是可以直接修改的,那么要怎么避免这种问题出现呢?


setup() {
    const {ref, provide, readonly} = Vue
    const message = ref('Hello World')
    provide('message', readonly(message))
    provide('changeMessage', () => {
        message.value = 'Hello Vue.js'
    })
    return { }
},
复制代码


  • 只需要在根组件中传递参数时,给参数添加一个readonly函数(此函数也是从Vue中解构出来的)。


  • 然后在定义一个修改数据值的方法,并用provide函数传递给子组件。


readonly函数也是从Vue中解构出来的,表示函数里面的数据值为只读状态不可修改。这样就可以避免子组件直接修改父组件的数据值了。


setup(){
    const {inject} = Vue
    const message = inject('message')
    const changeMessage = inject('changeMessage')
    const handleClick = () => {
        changeMessage()
    }
    return {message, handleClick}
},
复制代码


  • 子组件中需要接收根组件传递过来的方法,并在触发点击事件时调用根组件修改数据值的方法。


CD]LR%31{_FF])B[C3S_727.png


模板中的ref


💭 模板中的ref是以前在基础知识篇中学过的,是定义在DOM标签上的。


<div ref="hello">Hello World</div>
复制代码


如果我们需要获取到某个DOM元素,就需要通过this.$refs.xxx的方式获取。

想要在compositionAPI中获取到DOM元素该怎么做呢?


setup() {
    const { onMounted, ref } = Vue
    const hello = ref(null)
    onMounted(() => {
        console.log(hello.value)
    });
    return {hello}
},
复制代码


  • 首先我们定义和DOM元素中的ref值相同的变量值,并引用compositionAPI中的ref方法


  • compositionAPI中的ref方法中传入的是一个null,不需要给它定义值。


  • compositionAPI中的生命周期函数里面输出一下这个变量值,就可以看到控制台中的DOM元素被打印出来了。


PX@$_9_URT6A{(V@YV$RT_J.png


总结


本篇文章主要是和大家一起学习了compositionAPI中的最后一部分知识点。了解了基础知识中的生命周期函数和compositionAPI中的生命周期函数的区别;了解了compositionAPI中组件间传参的方法:provide和inject,并引出了readonly方法表示只读类型;最后还了解了一下模板中的ref的使用方法。


compositionAPI的篇章就正式完结了,希望大家在看的同时也能学到更多,大家加油!!

相关文章
|
15天前
|
JavaScript 前端开发 开发者
Vue 3中的Proxy
【10月更文挑战第23天】Vue 3中的`Proxy`为响应式系统带来了更强大、更灵活的功能,解决了Vue 2中响应式系统的一些局限性,同时在性能方面也有一定的提升,为开发者提供了更好的开发体验和性能保障。
35 7
|
15天前
|
JavaScript 数据管理 Java
在 Vue 3 中使用 Proxy 实现数据双向绑定的性能如何?
【10月更文挑战第23天】Vue 3中使用Proxy实现数据双向绑定在多个方面都带来了性能的提升,从更高效的响应式追踪、更好的初始化性能、对数组操作的优化到更优的内存管理等,使得Vue 3在处理复杂的应用场景和大量数据时能够更加高效和稳定地运行。
36 1
|
15天前
|
JavaScript 开发者
在 Vue 3 中使用 Proxy 实现数据的双向绑定
【10月更文挑战第23天】Vue 3利用 `Proxy` 实现了数据的双向绑定,无论是使用内置的指令如 `v-model`,还是通过自定义事件或自定义指令,都能够方便地实现数据与视图之间的双向交互,满足不同场景下的开发需求。
36 1
|
5天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
5天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
5天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
5天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
4天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
6天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
4天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉