vue -- watch侦听器与父子组件间通信
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侦听器与父子组件间通信相关推荐
- 【Vue父子组件间通信】
Vue父子组件间通信 父子组件通信 父传子 (props) 子传父 (自定义事件) 完整代码 效果 父子组件通信 父传子 (props) (1)在父组件中使用子组件时,给子组件一个自定义属性,这个属性 ...
- vue的侦听器,过滤器和过度动画的了解
目录 侦听器 普通监听 深度监听 百度搜索案例 过滤器 局部过滤器 全局过滤器 全局过滤器和局部过滤器的区别 封装时间过滤器 总结 计算属性和 watch 的区别 vue过渡动画 transition ...
- 初识 Vue(18)---(非父子组件间的传值)
非父子组件间的传值 常一个应用会以一棵嵌套的组件树的形式来组织:将一个大组件进行拆分 下图这种情况的组件间传值(父子组件间传值) 方法:父组件通过 Props 向子组件传值,子组件通过事件触发向父组件 ...
- Vue学习(十六):组件间通信
1. props 1.1 使用 功能:让组件接收外部传过来的数据 传递数据:<Demo name="xxx"/> 接收数据: 第一种方式(只接收):props:['na ...
- vue 父子组件间通信
前言 在vue项目中,封装组件,涉及到父子组件的传值,本文主要讲解父子组件之间传值的方法. 一.props / $emit 适用于父子组件通信,单向数据流,这种方法是 vue 组件的基础. 二.ref ...
- Vue2.0入门系列——父子组件间通信
1.子组件更新,父组件不变 点击"按钮"按钮,子组件数据被修改,父组件数据不变 =========>>>>>> 项目源代码, <hea ...
- 模糊查询 vue 监听器/侦听器实现版本
<template><div><!-- 输入框 --><input type="text" v-model="keyWord&q ...
- Vue父子组件间通信
组件是vue.js最强大的功能之一,但组件之间的作用域是相互独立的,这就意味着不同组件之间的数据是无法相互引用的.为实现组件之间的通信,vue为我们提供了三种方式:prop.ref.emit. 首先创 ...
- Vue的全局事件总线实现任意组件间通信
全局事件总线原理:利用自定义事件实现 在main.js中安装全局事件总线 import Vue from 'vue'; import App from 'App.vue'; new Vue({rend ...
最新文章
- 百炼智百炼智能获5000万元Pre-A轮融资,深耕智能获客赛道
- 机器字长,指令字长,数据子长,MDR
- android x86 笔记本卡屏,笔记本死机卡屏怎么办
- WSL安装Oracle,折腾记录:WSL(Windows Subsystem for Linux,Windows上的Linux子系统)安装后的环境配置-Go语言中文社区...
- 2ab对应的c语言表达式是,编译原理 作业标准答案
- 有偿数据收集 | 哈工大手写作文图片收集
- 用PHP调用WEBSERVICE
- 一、tkinter简介
- python:画混淆矩阵
- MATLAB 高等数学中的应用
- 32位 java8u_java8下载 Java8.0U181官方正式版(32位/64位)
- JS校验银行卡号以及通过银行卡号自动带出所属银行信息
- 一个div实现太极图案+动画(简单易懂)
- 计算机前沿应用,计算机前沿技术总结范文
- 推荐 | 九本不容错过的深度学习和神经网络书籍
- 高防虚拟主机怎么选?
- 身高预测_大部分都很准哦
- 软件开发生命周期及开发模型
- Vue 组件事件触发另一个组件的事件
- 链路追踪:SkyWalking
热门文章
- 上海交通大学819-上交819-考研上岸经验
- PS葵花宝典--PS实用教程100
- 计算机名称更改不生效,修改文件后缀名无效怎么办?Win7系统修改文件扩展名无效的解决方法...
- 预防程序员最大的敌人:腰间盘突出和颈椎病
- May Cordova anonymously report usage statistics to improve the tool over time?
- Java中的锁详解篇
- golang:线程安全的map----sync.Map
- 文明3:征服(Conquest)重要变动参考
- linux修改进程名字,linux修改进程名
- 【项目实战全解】基于深度学习与自然语言处理的AI文本生成(自动写作)