vue2的方法与监听

news2024/11/26 6:47:47

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>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Py列表(list)

目录 正向索引&#xff1a; 反向索引&#xff1a; 嵌套列表&#xff1a; 修改列表中的值 列表常用的方法 实例 练习&#xff1a; 正向索引&#xff1a; 从0开始&#xff0c;依次递增。第一个元素的索引为0&#xff0c;第二个元素的索引为1&#xff0c;依此类推。 列表的下标…

代码文本编辑器-小白教程(Sublime text, Notepad++ Acode下载安装与使用)

代码文本编辑器-小白教程&#xff08;Sublime text, Notepad Acode下载安装与使用&#xff09; 1. Windows平台和Linux平台1.1 Sublime text1.2 Notepad 2. 安卓平台 Acode参考资料 1. Windows平台和Linux平台 1.1 Sublime text 一、安装教程 1、打开Sublime Text官网下载安…

C# 泛型函数

1.非约束 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace MyGeneirc {public class GeneircMethod{/// <summary>/// 泛型方法解决&#xff0c;一个方法&#xff0c;满足不同参数类型…

08、SpringBoot 源码分析 - 自动配置深度分析一

SpringBoot 源码分析 - 自动配置深度分析一 refresh和自动配置大致流程如何自动配置SpringBootApplication注解EnableAutoConfiguration注解AutoConfigurationImportSelector自动配置导入选择器DeferredImportSelectorHandler的handleDeferredImportSelectorGroupingHandler的r…

NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

打开题目后&#xff0c;点击三个&#xff1f;&#xff0c;发现是一个php序列化脚本 <?phpheader("Content-type:text/html;charsetutf-8"); error_reporting(0); show_source("class.php");class HaHaHa{public $admin;public $passwd;public function…

互联网应用主流框架整合之数据库事务管理

在互联网系统中同时运行着成千上百个线程是十分常见的事情&#xff0c;尤其当一个热门出现时&#xff0c;用户几乎同时打开手机、电脑、平板灯设备进行访问&#xff0c;这样就会导致数据库处在一个多事务访问的环境中&#xff0c;从而引发数据丢失或者数据不一致的现象&#xf…

2024.05.28学习记录

1. 小林coding 计网复习 2.代码随想录刷题. 图论.和复习数组.链表 3.rosebush完成select组件

3DEXPERIENCE DELMIA Role: RFP - Fabrication Robot Programmer

Discipline: Robotics Role: RFP - Fabrication Robot Programmer 在虚拟工厂中定义、验证和编程机器人弧焊和密封剂沉积系统 模拟和验证完整的焊接、密封剂沉积和搬运机器人系统&#xff0c;以消除代价高昂的碰撞并优化生产率提供精确的生产就绪型机器人程序&#xff0c;同…

医疗图像处理2023:Transformers in medical imaging: A survey

医学成像中的transformer:综述 目录 一、介绍 贡献与安排 二、CNN和Transformer 1.CNN 2.ViT 三、Transformer应用于各个领域 1.图像分割 1&#xff09;器官特异性 ①2D ②3D 2&#xff09;多器官类别 ①纯transformer ②混合架构 单尺度 多尺度 3&#xff09;…

养老院管理系统基于springboot的养老院管理系统java项目

文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色&#xff1a;超级…

【乐吾乐3D可视化组态编辑器】相机与视角

系统默认的相机为环绕旋转相机&#xff0c;它可以环绕一个中心点做上下左右的旋转&#xff0c;来从不同角度观察场景。当然&#xff0c;您也可以把一些特定角度的信息保存下来&#xff0c;在系统中我们把这个信息称作视角。通过交互中的切换视角动作&#xff0c;您就可以实现把…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染&#xff0c;是用少数数据做模板&#xff0c;实现海量物体渲染的手段方法。用实例化渲染&#xff0c;需要对每个实例产生一定描述数据。如何实现&#xff1f;请看本文下…

攻击同学网络,让同学断网

技术介绍&#xff1a;ARP欺骗 ARP欺骗&#xff08;ARP spoofing&#xff09;是一种网络攻击技术&#xff0c;它通过伪造ARP&#xff08;地址解析协议&#xff09;响应包来欺骗目标设备&#xff0c;使其将网络流量发送到攻击者指定的位置。具体操作步骤如下&#xff1a; 攻击者…

你的手机是如何控制你的手表之广播篇

前言 要让手机能够控制手表&#xff0c;第一步当然要让手机能够“看见”手表&#xff0c;人类作为上帝视角&#xff0c;我们是能够通过眼睛直接看见手机和手表的&#xff0c;但要让手机“看见”手表&#xff0c;就需要一端把自己的信息通过电磁波的形式发往空中&#xff0c;另…

ADIL简单测试实例

参考资料&#xff1a;https://blog.csdn.net/geyichongchujianghu/article/details/130045373这个连接是Java的代码&#xff0c;我根据它的链接写了一个kotlin版本的。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android平台上用于进程间通信&…

redis 主从复制薪火相传 哨兵sentinel配置以及底层原理

薪火相传 我们知道redis的主从复制还有一个常见的架构 ---薪火相传 使用这种结构可以有效减轻master节点的复制数据同步压力 注意这里的6380节点仍然是slave节点 可以理解为一个中间节点,仍然是不可以写只可以读取的 我们只需要使用 slaveof ip port 这里可能访问节点的时候出…

电力电子技术03 (1)---电路稳态分析方法

学习来源&#xff08;只用于个人学习笔记&#xff0c;建议对着老师视频学习理解更深入&#xff09;&#xff1a;2.2稳态分析的基本方法_哔哩哔哩_bilibili 一、Buck降压电路 Buck电路&#xff0c;也称为降压转换器&#xff0c;是一种DC-DC电压转换器&#xff0c;用于将输入电…

7个靠谱的副业赚钱方法,宝妈,上班族,学生党可以做的兼职副业

你是否也曾面临过这样的困境&#xff1a;生活费紧张&#xff0c;想要找份兼职来补贴家用或是满足自己的小心愿&#xff1f;别担心&#xff0c;今天我将带领你踏入这个丰富多彩的兼职世界&#xff0c;助你轻松达成月入过千的小目标&#xff01; 在我漫长的兼职探索旅程中&#…

Java GC问题排查的一些个人总结和问题复盘

个人博客 Java GC问题排查的一些个人总结和问题复盘 | iwts’s blog 是否存在GC问题判断指标 有的比较明显&#xff0c;比如发布上线后内存直接就起飞了&#xff0c;这种也是比较好排查的&#xff0c;也是最多的。如果单纯从优化角度&#xff0c;看当前应用是否需要优化&…

C++的算法:枚举法的原理及应用

在C++编程中,枚举法,又称穷举法或暴力法,是一种非常基础和常见的算法解题方法。它的核心思想在于:通过遍历所有可能的情况,然后逐一检查每个情况是否满足问题的要求,从而找到问题的解决方案。 一、枚举法的原理 枚举法的核心在于穷举和验证。它将问题的所有可能性一一列举…