watch侦听器

方式一

1.默认有两个参数 newValue与oldValue
2.如果是对象类型那么拿到的是代理对象
如果要进行深度监听 需要加上
deep : true
如果想要第一次渲染直接执行一次监听器
immediate : true

Vue.toRaw 获取原始对象

        watch: {message(newValue, oldValue) {console.log("message数据发生变化", newValue, oldValue);},info(newValue, oldValue) {console.log(Vue.toRaw(newValue));},

方式二

使用this.$watch进行监听
1.第一个参数是要侦听的源
2.第二个参数是侦听的回调函数
3.第三个参数是额外的其他选项 如deep immediate

        created() {console.log("created");this.$watch("message",(newValue, oldValue) => {console.log("message数据变化", newValue, oldValue);},{ deep: true });},

组件间的通信

父子组件间的通信方式

父组件传递给子组件 通过props
子组件传递给父组件 通过$emit触发

什么是props
props是你可以在组件上注册一些自定义的attribute
父组件给这些attribute赋值 子组件通过attribute的名称获取到对应的值

props 有两种常见的用法
方式一:字符串数组 数组中的字符串就是attribute的名称
方式二:对象类型 对象类型我们可以在指定attribute名称的同时 指定它需要传递的类型 是否是必须的 默认值等

props数组语法
弊端:1.不能进行类型检测 2.没有默认值

props: ["name", 'age', 'height']

props对象语法
对象类型的默认值要是函数

 props: {name: {type: String,default: '我是默认的name'},age: {type: Number,required: true,default: 0},height: {type: Number,default: 2},friend: {type: Object,default: () => ({ name: 'james' })

type的类型
String
Number
Boolean
Array
Object
Date
Function
Symbol

Props的大小写命名
HTML 中的 attribute 名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符;
这意味着当你使用 DOM 中的模板时,camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名)
命名;

对于非Prop的Attribute
什么是非Prop的Attribute
当我们传递给一个组件某个属性 当时该属性并没有定义对应的props或者emits时 就称为非Props的Attribute
常见的包括class style id属性等

如果当组件有单个根节点时 并且当前的属性是一个非props的attribute 那么该属性会默认添加到子组件的根元素上
如果我们不希望组件的根元素继承attribute 可以在组件中设置inheritAttrs:false

export default {inheritAttrs: false
}

禁用attribute继承的常见情况是需要将attribute应用于根元素之外的其他元素
我们可以通过$attrs来访问所有的非props的attribute

<div>非Prop的Attribute<h2 :class="$attrs.class"></h2>
</div>

多个根节点的attribute
多个根节点的attribute如果没有显示的绑定 那么会报警告 我们必须手动的指定要绑定到哪一个属性上

<template><div :class="$sttrs.class">非Prop的Attribute1</div><div>非Prop的Attribute2</div>
</template>

子组件传递给父组件

什么情况下子组件需要传递内容给父组件的?
1.当子组件有一些事件发生的时候 比如在组件中发生了点击 父组件需要切换内容
2.子组件有一些内容想要传递给父组件的时候

如何完成上述操作
1.在子组件中定义好在某些情况下触发的事件名称
2.在父组件中以v-on的方式传入要监听的事件的名称 并且绑定到对应的方法中
3.在子组件中发生某个事件的时候 根据事件名称触发对应的事件

emits数组写法

emits:['add']

emits的对象写法 对传递的参数进行验证 很少用

emits:{add:function(count){if(count <= 10){return true   }return false}
}

自定义事件的时候 我们也可以传递一些参数给父组件
第一个参数 自定义的事件名称
第二个参数 传递的参数

     btnClick(count) {this.$emit('add', count)}

在vue3中我们可以对传递的参数进行验证

emits:{addOne:null;addTen:function(playload){if(playload === 10){return true  }return false}
}

综合案例 点击按钮数字加加

<template><div class="app"><h2>当前计数 :{{counter}}</h2><!-- 自定义add-counter 并监听内部add事件 --><add-counter @add="addBtnClick"></add-counter></div>
</template><script>
import AddCounter from './AddCounter.vue'
import SubCounter from './SubCounter.vue'
export default {data() {return {counter: 0}},components: {AddCounter,SubCounter,},methods: {addBtnClick(count) {this.counter += count},subBtnClick(count) {this.counter += count}}
}
</script>
<template><div class="add"><button @click="btnClick(1)">+1</button><button @click="btnClick(5)">+5</button><button @click="btnClick(10)">+10</button></div>
</template><script>
export default {emits: {add: function (count) {if (count <= 10) {return true}return false}},methods: {btnClick(count) {this.$emit('add', count)}}
}
</script>

vue -- watch侦听器与父子组件间通信相关推荐

  1. 【Vue父子组件间通信】

    Vue父子组件间通信 父子组件通信 父传子 (props) 子传父 (自定义事件) 完整代码 效果 父子组件通信 父传子 (props) (1)在父组件中使用子组件时,给子组件一个自定义属性,这个属性 ...

  2. vue的侦听器,过滤器和过度动画的了解

    目录 侦听器 普通监听 深度监听 百度搜索案例 过滤器 局部过滤器 全局过滤器 全局过滤器和局部过滤器的区别 封装时间过滤器 总结 计算属性和 watch 的区别 vue过渡动画 transition ...

  3. 初识 Vue(18)---(非父子组件间的传值)

    非父子组件间的传值 常一个应用会以一棵嵌套的组件树的形式来组织:将一个大组件进行拆分 下图这种情况的组件间传值(父子组件间传值) 方法:父组件通过 Props 向子组件传值,子组件通过事件触发向父组件 ...

  4. Vue学习(十六):组件间通信

    1. props 1.1 使用 功能:让组件接收外部传过来的数据 传递数据:<Demo name="xxx"/> 接收数据: 第一种方式(只接收):props:['na ...

  5. vue 父子组件间通信

    前言 在vue项目中,封装组件,涉及到父子组件的传值,本文主要讲解父子组件之间传值的方法. 一.props / $emit 适用于父子组件通信,单向数据流,这种方法是 vue 组件的基础. 二.ref ...

  6. Vue2.0入门系列——父子组件间通信

    1.子组件更新,父组件不变 点击"按钮"按钮,子组件数据被修改,父组件数据不变  =========>>>>>>  项目源代码, <hea ...

  7. 模糊查询 vue 监听器/侦听器实现版本

    <template><div><!-- 输入框 --><input type="text" v-model="keyWord&q ...

  8. Vue父子组件间通信

    组件是vue.js最强大的功能之一,但组件之间的作用域是相互独立的,这就意味着不同组件之间的数据是无法相互引用的.为实现组件之间的通信,vue为我们提供了三种方式:prop.ref.emit. 首先创 ...

  9. Vue的全局事件总线实现任意组件间通信

    全局事件总线原理:利用自定义事件实现 在main.js中安装全局事件总线 import Vue from 'vue'; import App from 'App.vue'; new Vue({rend ...

最新文章

  1. 百炼智百炼智能获5000万元Pre-A轮融资,深耕智能获客赛道
  2. 机器字长,指令字长,数据子长,MDR
  3. android x86 笔记本卡屏,笔记本死机卡屏怎么办
  4. WSL安装Oracle,折腾记录:WSL(Windows Subsystem for Linux,Windows上的Linux子系统)安装后的环境配置-Go语言中文社区...
  5. 2ab对应的c语言表达式是,编译原理 作业标准答案
  6. 有偿数据收集 | 哈工大手写作文图片收集
  7. 用PHP调用WEBSERVICE
  8. 一、tkinter简介
  9. python:画混淆矩阵
  10. MATLAB 高等数学中的应用
  11. 32位 java8u_java8下载 Java8.0U181官方正式版(32位/64位)
  12. JS校验银行卡号以及通过银行卡号自动带出所属银行信息
  13. 一个div实现太极图案+动画(简单易懂)
  14. 计算机前沿应用,计算机前沿技术总结范文
  15. 推荐 | 九本不容错过的深度学习和神经网络书籍
  16. 高防虚拟主机怎么选?
  17. 身高预测_大部分都很准哦
  18. 软件开发生命周期及开发模型
  19. Vue 组件事件触发另一个组件的事件
  20. 链路追踪:SkyWalking

热门文章

  1. 上海交通大学819-上交819-考研上岸经验
  2. PS葵花宝典--PS实用教程100
  3. 计算机名称更改不生效,修改文件后缀名无效怎么办?Win7系统修改文件扩展名无效的解决方法...
  4. 预防程序员最大的敌人:腰间盘突出和颈椎病
  5. May Cordova anonymously report usage statistics to improve the tool over time?
  6. Java中的锁详解篇
  7. golang:线程安全的map----sync.Map
  8. 文明3:征服(Conquest)重要变动参考
  9. linux修改进程名字,linux修改进程名
  10. 【项目实战全解】基于深度学习与自然语言处理的AI文本生成(自动写作)