vue-3:生命周期,computed,watch,filter,虚拟dom和diff算法

这篇具有很好参考价值的文章主要介绍了vue-3:生命周期,computed,watch,filter,虚拟dom和diff算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

生命周期

Vue生命周期的主要阶段:4个before, 4个ed,创建,装载,更新,销毁

记得说单词:

第一次执行前4个生命周期钩子函数,

模板在mounted时渲染完毕,

父子组件的生命周期顺序(父组件前三个,子组件前四个,父组件再第四个)

 // 生命周期/*  */
    // 初始化阶段(不常用),拿不到data中的数据
    beforeCreate() {
        // 创建实例前
    },

    created() {
        // 发送ajax请求,获取数据,赋值data,渲染
    },
    // 挂载阶段
    beforeMount() {

    },
    // 可以拿到dom元素,进行性dom操作
    mounted() {

    },
    // 更新阶段 (触发它的更新,数据变化,dom元素新增或者删除)
    beforeUpdate() {

    },
    updated() {

    },
    // 销毁阶段
    // vue2:::
    // beforeDestroy(){

    // },
    // destroyed(){

    // }

    // vue3:::
    //  这两个钩子函数需要 触发页面的才可以看到执行
    //  可以在这个阶段,清除定时器,或者一些全局的函数
    //   想看到效果,需要销毁这个组件, 可以在父组件中销毁这个组件
    beforeUnmount() {

    },
    unmounted() {

    }

computed:{} 计算属性(总价+-*/)

  • // 对data中数据处理的 (长得像方法,使用起来像属性,计算属性)处理复杂逻辑

  • 计算属性在处理完第一次数据之后 会把处理好的结果缓存起来 只要依赖的数据不变 今后再使用就从缓存中进行读取

  • 计算属性有缓存 而方法只要被调用那么就执行(计算属性更节省性能)

  • 可读不可改,get set 可改可读

    //1.只能读,不能写
    computed:{
        revserMsg(){
            console.log('烦死了');
            return this.msg.split('').reverse().join('')
        }
    }

    //2.这样写,可读可写
get **必选**:会在计算属性再第一次被调用或者是在依赖的数据改变之后会自动执行  
并且返回一个处理好的结果

set **可选**:set里面必须有一个形参  这个形参就是计算属性修改之后的值  
什么时候被调用:就是再计算属性处理好的值 被修改的时候调用

    computed: {
            // 这样写,可读不可写
            // fullName(){
            //    return
            // }

            // 这样写,可读可写
            fullName:{
                get(){
                    return this.first+this.las
                },
                set(val){
                    console.log(val);
                    this.first = val.split('')[0]
                    this.las = val.split('')[1]
                }
            }
        }

watch:{} 侦听器:监听data中的数据 当data数据改变了 他就会触发 从而执行一些逻辑

  • 使用场景:数据变化时执行异步或开销比较大的操作。

  • watch不支持缓存,当对应属性发生变化的时候,响应执行。

  • 使用watch来侦听data中数据的变化,watch中的属性现阶段一定是data 中已经存在的数据。

  • 简写:
    watch:{
    	你要监听的data数据(newval,oldval){
    		你的逻辑
    	}
    }

1.handler方法 监听的数据改变的时候执行的回调函数

2.watch在首次加载不会触发 如果我们向触发 必须使用 immedate属性 来开启首次加载监听

3,再就是watch默认不会监听到对象的属性的改变 如果我们想监听对象的属性改变 我们可以使用deep

//监听器watch使用
    <div id="app">
        <!-- <input type="text" v-model="firsttext">
        +
        <input type="text" v-model="secondtext">
        =
        {{sumtext}} -->
        <input type="text" v-model="user.firsttext">
        +
        <input type="text" v-model="user.secondtext">
        =
        {{user.sumtext}}
    </div>

</html>
<script src="./lib/vue.global.js"></script>
<script>
    Vue.createApp({
        data() {
            return {
                // firsttext:'',
                // secondtext:'',
                // sumtext:''
                user: {
                    firsttext: '哈',
                    secondtext: '黑',
                    sumtext: ''
                }
            }
        },
        watch: {
            // // 简单写法(侦听器:侦听属性)
            // 1.
            // firsttext: function (newval,oldval) {
            //     this.sumtext = newval + this.secondtext
            //     console.log(this.newval);
            // },
            // secondtext: function(newval,oldval){
            //     this.sumtext = this.firsttext + newval
            // }

            // 2.打点写法,层次多麻烦
            // 'user.firsttext':function(newval,oldval){
            //     this.user.sumtext = newval + this.user.secondtext
            // },
            // 'user.secondtext':function(newval , oldval){
            //     this.user.sumtext = this.user.firsttext + newval
            // }


            // 复杂写法(深层侦听器:懒执行,添加立即执行即可解决)
            user: {
                // 开启深层监听器
                deep: true,
                // 强制回调函数立即执行
                immediate: true,
                // handler监听的数据改变的时候执行的回调函数
                handler(newval,oldval){
                    this.user.sumtext = newval.firsttext + newval.secondtext
                }
            }
        }
    }).mount('#app')

</script>

filter:{} 过滤器:处理一些数据(V3中没有,计算属性可替代)

局部过滤器:再不改变原始数据的情况下 格式化展示内容 但是仅仅只会对自己范围内数据生效


    <div id="app">
        <!-- {{ data数据 | 过滤器名}} -->
        {{time | newTime}}<br>
        <!-- {{ data数据 | 过滤器名(传递的值可以多个)}} -->
        {{msg | newMsg(' --- ','爱')}}<br>
        <!-- {{ data数据 | 过滤器名(传递的值可以多个) | 对前边的数据操作}} -->
        {{ msg | newMsg(' --- ','爱') | newNewMsg }}
    </div>
<script src="./lib/vue.js"></script>
<!-- <script src="./lib/vue.global.js"></script> -->
<script>
    let app = new Vue({
        data() {//数据
            return {
                time: 1314521,
                msg: 'hello world'
            }
        },
        methods: {//方法

        },
        computed: {//计算属性

        },
        watch: {//侦听器

        },
        filters: {//过滤器
            
            newTime(val) {// 传进的前一个值。默认值val
                // 将时间戳转换成日期对象,转换成日期对象
                return new Date(val).toLocaleString()
            },

            // newMsg(){
            //     return '哈哈哈哈哈'
            // },
            newMsg(val) {
                return val.split('').reverse().join('')
            },
            newMsg(val,x,y) {//val是默认的,是你处理的元素,x是reverseMsg的参数...val后可传递多个
                return val.split('').reverse().join(x)+y
            },
            newNewMsg(){
                return '哈哈哈哈哈'
            }
        },
        compontent: {//全局组件
            compontents: {//局部组件:带s
            }
        }
    })
    app.$mount("#app")
</script>

全局过滤器:再不改变原始数据的情况下 格式化展示内容 会对当前项目下所有位置数据生效

        // 全局过滤器filter
        // Vue.filter("过滤器的名字",(你要过滤器的数据)=>{
        //     return 你的逻辑
        // })
        Vue.filter("xiaoming",(val)=>{
            if(val.length>3){
                return val.substr(0,3)+"..."
            }else{
                return val
            }
        })

v-for和虚拟dom和diff算法

  • v-for 的默认行为会尝试原地修改元素而不是重新创建(就地更新)

    • 如何操作dom:循环出新的虚拟DOM结构, 和旧的虚拟DOM结构对比, 尝试复用标签就地更新内容

  • 虚拟dom

    • 实际上它只是一层对真实DOM的抽象,以JavaScript 对象 (VNode 节点) 作为基础的树,用对象的属性来描述节点,最终可以通过一系列操作使这棵树映射到真实环境上

    • 优点:提高DOM更新的性能, 不频繁操作真实DOM, 在内存中找到变化部分, 再更新真实DOM(打补丁)

      DOM是很慢的,其元素非常庞大,页面的性能问题,大部分都是由DOM操作引起的 真实的DOM节点,哪怕一个最简单的div也包含着很多属性

      操作DOM的代价仍旧是昂贵的,频繁操作还是会出现页面卡顿,影响用户的体验,所以使用虚拟dom

    • 实现思路: Vue中所有对象的 context(属性的意思) 选项都指向了 Vue 实例 所以Vue中,#app模板内的标签, 都要被vue处理成虚拟DOM对象, 才会渲染显示到真实DOM页面上

  • diff算法

    • diff算法如何比较新旧虚拟DOM? :

  1. 同级比较

  2. 根元素变了:删除重建 DOM树

  3. 根元素没变, 属性改变: DOM复用, 只更新属性

    • v-for有没有 :key=" "

      • 虚拟DOM的唯一标识

      • 没有key,v-for会最大限度的就地更新,复用相同类型元素

      • 有key属性, diff算法会根据你的key值进行比较:相当于直接插入,提高了更新效率文章来源地址https://www.toymoban.com/news/detail-441204.html

到了这里,关于vue-3:生命周期,computed,watch,filter,虚拟dom和diff算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 虚拟dom及diff算法之 —— h函数和diff函数

    新虚拟dom和老虚拟dom进行diff算法(精细化比较),算出如何最小量更新,最后反映到真实dom上 diff是发生在虚拟dom上的 模板编译 虚拟dom如何产生 - 渲染函数(h函数) h函数产生虚拟节点(vnode) Dom节点: a href=\\\"https://www.baidu.com\\\"真实Dom/a 调用h函数: h(\\\'a\\\',{props:{href:\\\"https://www

    2024年02月06日
    浏览(42)
  • 什么是Vue中的生命周期钩子函数?有哪些主要的生命周期钩子函数?如何监听DOM事件?

    Vue中的生命周期钩子函数是指在Vue实例创建、数据绑定、组件挂载等生命周期阶段中,可以执行一些特定操作的函数。这些函数在Vue实例的不同生命周期阶段被调用,可以帮助开发者更好地控制Vue实例的行为。 Vue的生命周期钩子函数包括: beforeCreate :在Vue实例创建之前调用

    2024年02月12日
    浏览(57)
  • 学习Vue:computed VS watch

    在 Vue.js 中,Vue 实例与数据绑定不仅限于简单的插值表达式和指令。在实际开发中,您可能会遇到更复杂的数据处理需求。为此,Vue 提供了计算属性和侦听器这两个强大的工具,让您能够更灵活地处理和响应数据变化。 计算属性是 Vue 实例中的一个特殊属性,它允许您定义一

    2024年02月12日
    浏览(70)
  • Vue 中的 computed 和 watch 的区别

    在Vue.js中, computed 和 watch 是两个常用的属性,用于处理数据的监听和响应。它们在功能上有一些相似之处,但也有一些重要的区别。本文将介绍 computed 和 watch 的区别,并提供相关的代码示例。 Vue 中的 computed 和 watch 都是用来观察数据变化的,但它们的用途和特点略有不同

    2024年02月07日
    浏览(48)
  • Vue3的computed和watch

    目录 1、computed 2、computed完整写法  3、watch 4、watch监听对象具体属性 5、watch 监听reactive数据 1、computed 基于现有的数据计算出新的数据 2、computed完整写法   3、watch 1 . 侦听一个数据 第一个参数:监听的数据 第二个回调函数 2.侦听多个数据 第一个参数监听的数据构成的数组

    2024年01月24日
    浏览(41)
  • 浅谈Vue的属性,computed和watch

    是什么? 直接上demo,了解一下语法先~ conputed是 计算 属性,watch是 监听 属性,本质上都是同一个 watcher实例 ,它们都是 通过响应式系统与数据,页面建立通信 。 computed带有 \\\"懒计算\\\" 功能 监听的逻辑有差异 :computed是依赖的值变了,它去重新求值,watch是目标值变了,它去

    2024年01月18日
    浏览(45)
  • 【Vue】watch、methods 和 computed 的区别?

    一、基本说明 1.computed: 计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。 2.methods: methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方 法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。 3.watch: 观察

    2024年02月09日
    浏览(54)
  • vue3 computed 和 watch 的差异

    🙂博主:锅盖哒 🙂文章核心: vue3 computed 和 watch 的差异 目录 前言 用法 computed watch 代码 理解 高质量的使用 Vue.js作为一种现代化的前端框架,提供了丰富的特性来帮助开发者构建高效和响应式的用户界面。在这其中, computed 和 watch 是两个非常重要的选项,它们都用于处理

    2024年02月08日
    浏览(49)
  • Vue3学习——computed、watch、watchEffect

    与Vue2.x中computed配置功能一致 写法 注意 监视reactive定义的响应式数据时:oldValue无法正确获取、强制开启了深度监视(deep配置失效)。 监视reactive定义的响应式数据中的某个属性时:deep配置有效。 情况一:监视ref定义的响应式数据 监视ref定义的对象,改变某一个属性时,

    2024年02月22日
    浏览(64)
  • Vue 中的 watch 和 computed 的区别是什么?

    在 Vue.js 中, watch 和 computed 都是用来监听数据变化的方式,但它们的使用方式和实现机制有所不同,下面是它们的区别: ✨ 实现机制 watch 监听的是一个具体的数据,当数据变化之后会执行相应的回调函数; computed 属性就像一个响应式的计算属性,是基于所依赖的数据进行

    2024年02月05日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包