vue2的方法与监听

vue2的方法

不可以使用箭头函数

<template>
<div>
     <div>{{sum2()}}</div>
     <button @click="add">add</button>
</div>
    
</template>

<script>
export default {
   data(){
    return{
             name:"张三",
             num:20,
             num2:30,
     }
   },
   methods:{
      sum2(){
        console.log('sum2')
        return this.num+ this.num2
      },
      /**
       * 注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。
       * 理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。
       * 这时this其实是methods的this,但是methods没别任何对象调用所以他的this是undefined
       * 函数的this指向调用他的对象
       */
      add:()=>{
        // this.num++
        // console.log(this.num)
        console.log(this)
      }
   },
   computed:{
      sum(){
        console.log('sum')
        return this.num+ this.num2
      }
   },
   watch:{
      num(){
        console.log('num')
        return this.num+ this.num2
      }
   },
   beforeCreate(){
      console.log('beforeCreate')
      }
}
</script>

<style lang="scss" scoped>

</style>
add:()=>{
        // this.num++
        // console.log(this.num)
        console.log(this)
      }

使用箭头函数时报错,打印一下发现箭头函数功能直接指向父级元素(这里是)methods,所以这里的this是methods的this因为未被调用所以是空的

注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。
* 理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。
* 这时this其实是methods的this,但是methods没别任何对象调用所以他的this是undefined
* 函数的this指向调用他的对象

vue2监听

新建文件

修改路由

来到watch->index.vue

<template>
    <div>
        <h1>监听</h1>
        <p>{{ num }}</p>
        <button @click="num++">+</button>
        <button @click="dog.name = '小柏'">+</button>

    </div>
</template>

<script>
export default {
    data() {
        return {
            num: 1,
            dog: {
                name: '小狗',
                age: 1
            }
        }
    },
    watch: {
        /**
         * 1.简写,监听属性不依赖其他属性,修改值就会触发,一旦触发了被监听属性的set就会触发
         */
        num(newV, oldV) {
            console.log('新值', newV, '旧值', oldV)
        },
        // dog(newV, oldV) {
        //     console.log('新值', newV, '旧值', oldV)
        // }
        dog: {
            deep: true,// 深度监听,监听对象中的属性变化
            handler(newV, oldV) {
                console.log('新值', newV, '旧值', oldV)
            },
            immediate: true//立即开始监听,页面第一次渲染时或者刷新时就会触发
        },
        'dog.age': {//这样直接监听对象的属性
            handler(newV, oldV) {
                console.log('新值', newV, '旧值', oldV)
            },
            immediate: true

        }
    }
}
</script>
<style scoped lang='scss'></style>

 num(newV, oldV) {
            console.log('新值', newV, '旧值', oldV)
        },

监听对象和对象属性

监听对象俩个方法选择其一,才会触发

immediate: true//立即开始监听,页面第一次渲染时或者刷新时就会触发
deep: true,// 深度监听,监听对象中的属性变化
   dog: {
            deep: true,// 深度监听,监听对象中的属性变化
            handler(newV, oldV) {
                console.log('新值', newV, '旧值', oldV)
            },
            immediate: true//立即开始监听,页面第一次渲染时或者刷新时就会触发
        },
        'dog.age': {//这样直接监听对象的属性
            handler(newV, oldV) {
                console.log('新值', newV, '旧值', oldV)
            },
            immediate: true

        }

vue2父传子

// 父传子搭配生命周期的理解

新建文件

切换路由

生命周期父子组件运行与销毁

parent.vue

引用使用子的文件

import Child from "./child";
//定义自己的名字是parent,引用子组件儿子的名字
name: 'parent',
components: { Child },
//在div内使用它
<Child/>

定义生命周期并对起销毁,给一个show属性,为true控制开关

return {
            show: true
        }
 beforeCreate() {
        console.log('父组件', 'beforeCreate')
    },
    created() {
        console.log('父组件', 'created')
    },
    beforeMount() {
        console.log('父组件', 'beforeMount')
    },
    mounted() {
        console.log('父组件', 'mounted')
    },
    beforeUpdate() {
        console.log('父组件', 'beforeUpdate')
    },
    updated() {
        console.log('父组件', 'updated')
    },
    beforeDestroy() {
        console.log('父组件', 'beforeDestroy')
    },
    destroyed() {
        console.log('父组件', 'destroyed')
    },

把父里面的值传个子,并使用按钮控制开关

 <Child v-if="show"/>
 <button @click="show = !show">按钮</button>

parent.vue全部代码

<template>
    <div>
        <Child v-if="show"/>
        <button @click="show = !show">按钮</button>
    </div>
</template>

<script>
/**
 * 父传子,通过自定义属性传参,即props
 * 父组件将要传递的参数通过v-bind绑定到自组件上
 * :属性名="参数值"
 */
import Child from "./child";
export default {
    name: 'parent',
    components: { Child },
    data() {
        return {
            show: true
        }
    },
    /**
     * 当父子组件嵌套时
     * 会先将父组件初始化,但不会进行挂载
     * 然后开始进行子组件的初始化以及挂载
     * 子组件挂载完毕时,才会挂载父组件
     * 销毁的时候,先销毁子组件,然后才会触发父组件的updated钩子
     */
    beforeCreate() {
        console.log('父组件', 'beforeCreate')
    },
    created() {
        console.log('父组件', 'created')
    },
    beforeMount() {
        console.log('父组件', 'beforeMount')
    },
    mounted() {
        console.log('父组件', 'mounted')
    },
    beforeUpdate() {
        console.log('父组件', 'beforeUpdate')
    },
    updated() {
        console.log('父组件', 'updated')
    },
    beforeDestroy() {
        console.log('父组件', 'beforeDestroy')
    },
    destroyed() {
        console.log('父组件', 'destroyed')
    },
    methods: {},
    computed: {}
}
</script>
<style scoped lang='scss'></style>

子和父运行生命周期,并对起销毁

child.vue

定义一下自己的名字

 name: 'child',

在子组件里用生命周期,看看执行顺序

<template>
    <div>
        子组件
    </div>
</template>

<script>
/**
 * 自组件通过props接受父组件传递的值
 * props中的属性被混入了当前的子组件中
 * 可以通过this直接访问到
 * 注意:子组件不允许修改父组件传递的值,否则会破坏vue的单向数据流
 */
export default {
    name: 'child',
    data() {
        return {
        }
    },
    beforeCreate() {
        console.log('子组件beforeCreate')
    },
    created() {
        console.log('子组件created')
    },
    beforeMount() {
        console.log('子组件beforeMount')
    },
    mounted() {
        console.log('子组件mounted')
    },
    beforeUpdate() {
        console.log('子组件beforeUpdate')
    },
    updated() {
        console.log('子组件updated')
    },
    beforeDestroy() {
        console.log('子组件beforeDestroy')
    },
    destroyed() {
        console.log('子组件destroyed')
    },
   
    
}
</script>
<style scoped lang='scss'></style>

show 初始值为 true,<Child> 组件在初始渲染时会被显示出来。

当点击show将flase隐藏,对子组件进行销毁

  • 当父子组件嵌套时
    • 会先将父组件初始化,但不会进行挂载
    • 然后开始进行子组件的初始化以及挂载
    • 子组件挂载完毕时,才会挂载父组件
    • 销毁的时候,先销毁子组件,然后才会触发父组件的updated钩子

注意:子组件不允许修改父组件传递的值,否则会破坏vue的单向数据流

<template>
    <div>
        子组件
        <p>{{ age }}</p>
    </div>
</template>

<script>
/**
 * 子组件通过props接受父组件传递的值
 * props中的属性被混入了当前的子组件中
 * 可以通过this直接访问到
 * 注意:子组件不允许修改父组件传递的值,否则会破坏vue的单向数据流
 */
export default {
    /**
     * 1.简写
     * props: ['age'],
     */
    /**
     * 2.完整写法
     */
    props: {
        age: {
            type: Number,//类型
            default: 18,//默认值
            required: true,//是否必须
            validator: (v) => { return true }//校验规则
        }
    },
    name: 'child',
    data() {
        return {
        }
    },
    beforeCreate() {
        console.log('子组件beforeCreate')
    },
    created() {
        console.log('子组件created')
    },
    beforeMount() {
        console.log('子组件beforeMount')
    },
    mounted() {
        console.log('子组件mounted')
        /**
         * $parent
         * 1.获取父组件的实例
         * 2.通过$parent可以访问到父组件的实例,从而访问到父组件中的数据和方法
         */
        setTimeout(() => {
            console.log(this.$parent, '父组件')
        }, 100);
    },
    beforeUpdate() {
        console.log('子组件beforeUpdate')
    },
    updated() {
        console.log('子组件updated')
    },
    beforeDestroy() {
        console.log('子组件beforeDestroy')
    },
    destroyed() {
        console.log('子组件destroyed')
    },
}
</script>
<style scoped lang='scss'></style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/651542.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI分析SP和pk进行sk分析

SP原始表行标题代表题目序号&#xff0c;列代表学生&#xff0c;如果学生答对题目为1&#xff0c;否则为0。问题知识点矩阵这个文件横轴代表每个知识点&#xff0c;列标题代表每个题目序号&#xff0c;如果题目包含这个知识点则该处值为1。通过两个文件判断学生对于每个知识点的…

达梦数据库创建根据日期按月自动分区表

达梦数据库创建根据日期自动分区表 概念 达梦数据交换平台(简称DMETL)是在总结了众多大数据项目经验和需求并结合最新大数据发展趋势和技术的基础上&#xff0c;自主研发的通用的大数据处理与集成平台。 DMETL创新地将传统的ETL工具&#xff08;Extract、Transform、Loading…

计算机网络6——应用层6

文章目录 一、应用进程跨越网络的通信1、系统调用和应用编程接口2、几种常用的系统调用1&#xff09;连接建立阶段2&#xff09;数据传送阶段3&#xff09;连接释放阶段 二、P2P 应用1、具有集中目录服务器的P2P工作方式2、具有全分布式结构的P2P文件共享程序3、P2P 文件分发的…

Android 通过布局生成图片

通过布局生成图片 首先效果图 在竖屏的情况下通过&#xff0c;一般情况下&#xff0c;只要布局在页面上可见&#xff0c;并显示全&#xff0c;通过布局生成图片&#xff0c;都可以&#xff0c;但是横屏就不行了&#xff0c;会出现图片显示不完全的情况。 val bitmap Bitmap.c…

APM2.8用USB在线下载固件

1.把APM飞控用安卓手机的USB线插入电脑。 选择COM口&#xff0c;不要选择auto&#xff0c;如果你没有COM口说明你驱动安装有问题。 波特率115200。点击相应的图标就可以下载固件到飞控板。 请注意&#xff1a;烧录APM必须选择INSTALL FIRMWARE LEAGACY,第一个是用于刷pixhawk的…

sqpserver——利用scott库练习内连接(一)

一.查找每个员工的姓名&#xff0c;部门编号&#xff0c;薪水和薪水等级 select emp.ename, emp.deptno, emp.sal, SALGRADE.GRADE from emp join SALGRADE on emp.sal>LOSAL and emp.sal<HISAL; 二.查找每个部门的编号&#xf…

Cocos Creator 安卓环境配置

系统&#xff1a;Win10&#xff0c;引擎版本&#xff1a;CocosCreator3.8.2&#xff0c; 时间&#xff1a;2024.05.23 安装 Java SDK(JDK)下载地址 注意&#xff1a;Java版本对应的Gradle: 详见表 Table 1. Java Compatibility 此处选择 Java 21 对应 Gradle 8.5 配置Java系统…

【全开源】景区手绘地图导览系统源码(ThinkPHP+FastAdmin)

一款基于ThinkPHPFastAdmin开发多地图手绘地图导览系统(仅支持H5)&#xff0c;景区升4A5A必备系统&#xff0c;高级版支持全景。 ​打造个性化游览新体验 一、引言&#xff1a;景区导览系统的革新 在旅游业蓬勃发展的今天&#xff0c;景区导览系统成为了提升游客体验的关键。…

强化学习——学习笔记

一、什么是强化学习&#xff1f; 强化学习 (Reinforcement Learning, RL) 是一种通过与环境交互来学习决策策略的机器学习方法。它的核心思想是让智能体 (Agent) 在执行动作 (Action)、观察环境 (Environment) 反馈的状态 (State) 和奖励 (Reward) 的过程中&#xff0c;学习到…

三维大场景管理-3Dtiles规范

简介 &#xff1a; 这篇文章都是三年前写的了&#xff0c;一直在笔记库存中&#xff0c;今天把他放出来。主要是讲Cesium 的3Dtiles 格式&#xff0c;当然3Dtiles主要是解决场景管理大场景的LOD实现的问题&#xff0c;不管是剔除渲染性能优化之Culling 剔除或者 LOD 、3Dtiles…

安装HAP时提示“code:9568344 error: install parse profile prop check error”错误

问题现象 在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特…

使用 Spring Cloud Alibaba AI 构建 RAG 应用

作者&#xff1a;姬世文 背景介绍 RAG&#xff08;Retrieval Augmented Generation&#xff09; 检索增强生成&#xff08;RAG&#xff09;是一种用于将数据与人工智能模型集成的技术。在 RAG 工作流程中&#xff0c;第一步将文档数据加载到矢量数据库&#xff08;例如 Redi…

ssm145基于java的电脑硬件库存管理系统+jsp

电脑硬件库存管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对电脑硬件库存信息管理混乱&…

YOLOv8+PyQt5车辆类型检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

资源包含可视化的车辆类型检测系统&#xff0c;基于最新的YOLOv8训练的车辆类型检测模型&#xff0c;和基于PyQt5制作的可视化车辆类型检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的21种车辆类型&#xff0c;包…

初级爬虫的总结一

初级爬虫的总结一之百度网页爬虫 一、寻找正确的sugrec二、url拼接出问题&#xff0c;解决办法 我遇到的问题&#xff1a; 1、没有找对网页sugrec&#xff0c;导致connect-type没有找对&#xff0c;以及一些小问题 2、url拼接时候出现乱码 一、寻找正确的sugrec 1、打开百度网…

Linux基础 (十一):进程间通信

Linux进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;是指在不同进程之间交换数据或信息的机制。由于进程间不能直接共享内存&#xff0c;Linux 提供了多种 IPC 机制来实现进程间的通信。主要为&#xff1a;管道、信号量、共享内存、消息队列、套接字。 目…

完全背包洛谷题单

[USACO08NOV] Buying Hay S 题解&#xff1a;这题看到每个都可以卖出无限多个干草包&#xff0c;就应该想到完全背包&#xff0c;但又不同于普通的完全背包&#xff0c;普通的完全背包是让你通过对应的背包求出最大的价值&#xff0c;但是在这题理解上却是知道能够达到背包容量…

python数据分析——apply 2

参考资料&#xff1a;活用pandas库 1、向量化函数 使用apply时&#xff0c;可以按行或按列应用函数。如果想应用自定义的函数&#xff0c;必须重写它&#xff0c;因为整列或整行传递到了函数的第一个参数中。可以利用向量化函数和装饰器对所有函数进行向量化。对代码进行向量化…

计算机专业必考之计算机指令设计格式

计算机指令设计格式 例题&#xff1a; 1.设相对寻址的转移指令占3个字节&#xff0c;第一字节为操作码&#xff0c;第二&#xff0c;第三字节为相对偏移量&#xff0c; 数据在存储器以低地址为字地址的存放方式。 每当CPU从存储器取出一个字节时候&#xff0c;自动完成&…

uniCloud云存储uni-cdn七牛云扩展存储-开发uniapp项目节约开发成本

为什么要使用uniCloud的扩展存储&#xff0c;那就是省钱&#xff0c;而且DCloud也一直在推uni-cdn&#xff0c;我在项目中也使用七牛云的扩展存储&#xff0c;确实是省钱&#xff0c;如果你的项目使用到大量的图片后者音视频&#xff0c;这些的算计可以帮你省不少钱。下面就通过…