Vue基础知识总结 6:vue双向绑定原理

article/2025/11/9 16:37:31

🍅 作者简介:哪吒,CSDN2021博客之星亚军🏆、新星计划导师✌、博客专家💪

🍅 哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师

🍅 关注公众号【哪吒编程】,回复1024,获取Java学习路线思维导图、大厂面试真题、加入万粉计划交流群、一起学习进步

目录

一、前端代码初体验

1、代码实例

2、浏览器显示

 二、根据异常改进

1、监听事件,反向赋值

 2、代码实例

3、浏览器显示

三、联动修改num1的值

1、代码实例

2、浏览器显示

四、watch

五、通过$refs完成父访问子


需求分析:

通过输入框,双向绑定文本框显示。

一、前端代码初体验

1、代码实例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"><cpn :number1="num1":number2="num2"/>
</div><template id="cpn"><div><h2>{{number1}}</h2><input type="text" v-model="number1"><h2>{{number2}}</h2><input type="text" v-model="number2"></div>
</template><script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {num1: 1,num2: 0},components: {cpn: {template: '#cpn',props: {number1: Number,number2: Number},}}})
</script></body>
</html>

2、浏览器显示

错误信息

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "number1"

谷歌翻译 -->

避免直接改变 prop,因为每当父组件重新渲染时,值都会被覆盖。 相反,根据道具的值使用数据或计算属性。 道具被变异:“number1”

这时候要完成双向绑定怎么办呢?

红色异常显示,希望在data中定义一个其它属性。

输入框绑定方法:

 二、根据异常改进

1、监听事件,反向赋值

 2、代码实例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"><cpn :number1="num1":number2="num2"/>
</div><template id="cpn"><div><h2>{{number1}}</h2><h2>{{dnumber1}}</h2><input type="text" v-model="dnumber1"><h2>{{number2}}</h2><h2>{{dnumber2}}</h2><input type="text" v-model="dnumber2"></div>
</template><script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {num1: 1,num2: 0},components: {cpn: {template: '#cpn',props: {number1: Number,number2: Number},data(){return{dnumber1:this.number1,dnumber2:this.number2}}}}})
</script></body>
</html>

3、浏览器显示

三、联动修改num1的值

1、代码实例

但是,我想通过反向传到父组件中,也就是改变number1的值,也就是改变data中的num1,怎么整?

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"><cpn :number1="num1":number2="num2"@num1change="num1change"@num2change="num2change"/>
</div><template id="cpn"><div><h2>props:{{number1}}</h2><h2>data:{{dnumber1}}</h2><!--<input type="text" v-model="dnumber1">--><input type="text" :value="dnumber1" @input="num1Input"><h2>props:{{number2}}</h2><h2>data:{{dnumber2}}</h2><!--<input type="text" v-model="dnumber2">--><input type="text" :value="dnumber2" @input="num2Input"></div>
</template><script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {num1: 1,num2: 0},methods: {num1change(value) {this.num1 = parseFloat(value)},num2change(value) {this.num2 = parseFloat(value)}},components: {cpn: {template: '#cpn',props: {number1: Number,number2: Number},data() {return {dnumber1: this.number1,dnumber2: this.number2}},methods: {num1Input(event) {// 1.将input中的value赋值到dnumber中this.dnumber1 = event.target.value;// 2.为了让父组件可以修改值, 发出一个事件this.$emit('num1change', this.dnumber1)// 3.同时修饰dnumber2的值this.dnumber2 = this.dnumber1 * 100;this.$emit('num2change', this.dnumber2);},num2Input(event) {this.dnumber2 = event.target.value;this.$emit('num2change', this.dnumber2)// 同时修饰dnumber2的值this.dnumber1 = this.dnumber2 / 100;this.$emit('num1change', this.dnumber1);}}}}})
</script></body>
</html>

2、浏览器显示

四、watch

watch关键是监听某一属性的改变,是上面写法的一种变形写法。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"><cpn :number1="num1":number2="num2"@num1change="num1change"@num2change="num2change"/>
</div><template id="cpn"><div><h2>props:{{number1}}</h2><h2>data:{{dnumber1}}</h2><input type="text" v-model="dnumber1"><h2>props:{{number2}}</h2><h2>data:{{dnumber2}}</h2><input type="text" v-model="dnumber2"></div>
</template><script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {num1: 1,num2: 0},methods: {num1change(value) {this.num1 = parseFloat(value)},num2change(value) {this.num2 = parseFloat(value)}},components: {cpn: {template: '#cpn',props: {number1: Number,number2: Number,name: ''},data() {return {dnumber1: this.number1,dnumber2: this.number2}},watch: {dnumber1(newValue) {this.dnumber2 = newValue * 100;this.$emit('num1change', newValue);},dnumber2(newValue) {this.number1 = newValue / 100;this.$emit('num2change', newValue);}}}}})
</script></body>
</html>

五、通过$refs完成父访问子

父子组件通信

在开发中,往往有一些数据需要送上层传递到下层;

比如在一个页面中,我们从服务器请求到很多的数据,其中一部分数据,并非是我们整个页面大组件的,需要在子组件中进行展示,这时,并不会让子组件再次请求一次,而是直接从父组件将数据传递给子组件。

那么如何传递呢?

官方提到:

通过props向子组件传递数据;

通过事件向父组件传递数据;

一般不推荐使用$children,$children一般用于拿到所有组件的时候使用。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><div id="app"><cpn></cpn><cpn></cpn><my-cpn></my-cpn><y-cpn></y-cpn><cpn ref="aaa"></cpn><button @click="btnClick">按钮</button>
</div><template id="cpn"><div>我是子组件</div>
</template>
<script src="../js/vue.js"></script>
<script>const app = new Vue({el: '#app',data: {message: '你好啊'},methods: {btnClick() {// 1.$children// console.log(this.$children);// for (let c of this.$children) {//   console.log(c.name);//   c.showMessage();// }// 拿第三个组件的内容,但是下标值不太好用// console.log(this.$children[3].name);// 2.$refs => 对象类型, 默认是一个空的对象 ref='bbb'console.log(this.$refs.aaa.name);}},components: {cpn: {template: '#cpn',data() {return {name: '我是子组件的name'}},methods: {showMessage() {console.log('showMessage');}}},}})
</script></body>
</html>

上一篇:Vue基础知识总结 5:vue实现树形结构

下一篇:Vue基础知识总结 7:插槽slot与vue导入导出

关注公众号,备注1024,获取Java学习路线思维导图、加入万粉计划交流群  


http://chatgpt.dhexx.cn/article/3JBvZCVq.shtml

相关文章

7、Vue双向绑定原理和实现

原理 视图&#xff08;view&#xff09;变化更新数据&#xff08;data&#xff09;。这个很简单&#xff0c;通过事件监听就可以实现数据&#xff08;data&#xff09;变化更新视图&#xff08;view&#xff09;。通过数据劫持&#xff08;即Object.defineProperty( )方法&…

vue---双向绑定

目录 1、.sync修饰符-双向绑定 2、v-model修饰符-双向绑定 3、双向绑定原理 vue 中的双向绑定是语法糖。 1、.sync修饰符-双向绑定 . vue是单向数据流的。父组件可以通过prop向子组件传递数据。子组件需要通过自定义事件来将自己的数据变更通知给父组件&#xff0c;我们可以通过…

vue实现双向绑定的方式

什么是双向绑定 我们先从单向绑定切入,单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新. 双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mode…

vue数据双向绑定

5.Vue数据双向绑定 5.1.什么是双向数据绑定 Vue.js 是一个 MVVM 框架&#xff0c;即数据双向绑定&#xff0c;即当数据发生变化的时候&#xff0c;视图也就发生变化&#xff0c;当视图发生变化的时候&#xff0c;数据也会跟着同步变化。这也算是 Vue.js 的精髓之处了。 值得…

vue双向绑定原理

** Vue双向绑定的原理 一、在讲vue双向绑定之前我们需要来了解下MVVM模式 MVVM&#xff08;Model-View-ViewModel&#xff09;是对 MVC&#xff08;Model-View-Control&#xff09;和 MVP&#xff08;Model-View-Presenter&#xff09;的进一步改进。 View&#xff1a;视图层…

OpenCV中的图像处理 —— 傅里叶变换+模板匹配

OpenCV中的图像处理 —— 傅里叶变换模板匹配 现在也在逐渐深入啦&#xff0c;希望跟大家一起进步越来越强 目录 OpenCV中的图像处理 —— 傅里叶变换模板匹配1. 傅里叶变换1.1 Numpy实现傅里叶变换1.2 OpenCV实现傅里叶变换1.3 DFT的性能优化 2. 模板匹配2.1 单对象的模板匹配…

opencv 多角度模板匹配

总结一下实现多角度模板匹配踩的坑 一 、多角度匹配涉及到要使用mask&#xff0c;首先opencv matchTemplateMask自带的源码如下&#xff1a; static void matchTemplateMask( InputArray _img, InputArray _templ, OutputArray _result, int method, InputArray _mask ) {CV_A…

用OpenCV进行模板匹配

1. 引言 今天我们来研究一种传统图像处理领域中对象检测和跟踪不可或缺的方法——模板匹配&#xff0c;其主要目的是为了在图像上找到我们需要的图案&#xff0c;这听起来十分令人兴奋。 所以&#xff0c;事不宜迟&#xff0c;让我们直接开始吧&#xff01; 2. 概念 模板匹…

OpenCV之模板匹配

模板匹配的概念与原理 模板匹配是在一幅图像中寻找与另一幅模板图像最匹配&#xff08;相似&#xff09;部分的技术&#xff0c;在OpenCV中&#xff0c;模板匹配由函数MatchTemplate()函数实现。需要注意的是&#xff0c;模板匹配不是基于直方图的&#xff0c;而是通过在输入图…

基于OpenCV的模板匹配

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的, 而是通过在输入图像上滑动图像块(模板)同时比对相似度, 来对模板和输入图像进行匹配的一种方法。 image: 待搜索图像(大图)templ: 搜索模板, 需和原图一样的数据类型且尺寸…

【OpenCV系列】模板匹配

原理 什么是模板匹配? 模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 它是怎么实现的? 我们需要2幅图像: 我们的目标是检测最匹配的区域: 原图像 (I): 在这幅图像里,我们希望找到一块和模板匹配的区域模板 (T): 将和原图像比照的图像块 为了…

python opencv 模板匹配

模板匹配是在一个大图里搜索和找模板图像位置的方法。OpenCV有个函数cv2.matchTemplate()来做这个。它吧模板图像在输入图像上滑动&#xff0c;对比模板和在模板图像下的输入图像块。它返回了一个灰度图像&#xff0c;每个像素表示那个像素周围和模板匹配的情况。 如果输入图像…

基于OpenCV的图像匹配----模板匹配(一)

我先介绍一下模板匹配的原理 原图像&#xff1a;我们期望找到与模板图像匹配的图像 模板图像&#xff1a;将于模板图像进行比较的图像 一次移动一个像素&#xff08;从左到右&#xff0c;从上到下&#xff09;。在每个位置&#xff0c;计算相似度度量&#xff0c;以便它表示在…

OpenCV图像处理——模板匹配

总目录 图像处理总目录←点击这里 十一、模板匹配 11.1、原理 找一个图片上有的模板&#xff0c;和原图像进行模板匹配模板图像在待匹配图像上滑动&#xff0c;记录下每次滑动后的参数值&#xff08;如平方差&#xff0c;相关性&#xff09;。寻找最小值或最大值&#xff0…

OpenCV模板匹配算法详解

本博客在https://www.cnblogs.com/zhaoweiwei/p/OpenVC_matchTemplate.html基础上进行更加详细的注解。当初有几个地方看的比较费劲&#xff0c;但是里面没有注释&#xff0c;现给加上&#xff0c;主要是那些带黄色及红色部分的注释。 在此向weiwei22844致敬。 模板匹配是在一…

OpenCV 模板匹配(Template Match)

文章目录 模板匹配介绍模板匹配定义匹配算法平方差归一化的平方差相关性归一化的相关性相关性系数归一化的相关性系数 相关API代码示例 模板匹配介绍 模板匹配定义 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 所以模板匹配首先需要一个模板图像T&#xff…

OpenCV 模板匹配

模板匹配就是在大图中找小图&#xff0c;也就说在一幅图像中寻找另一幅模板图像的位置。 案例来源于傅老师。 模板匹配的操作方法是将模板图像B在图像A上滑动&#xff0c;遍历所有像素以完成匹配。 工作原理&#xff1a;在带检测图像上&#xff0c;从左到右&#xff0c;从上…

13 -- OpenCV学习—模板匹配

模板匹配 1.模板匹配 模板匹配&#xff1a;在给定的模板中查找最相似的区域 实现流程&#xff1a; 准备两幅图像 &#xff08;1&#xff09;原图 &#xff08;2&#xff09;模板图滑动模板块和原图像进行比对对于每个像素位置。将计算结果存在矩阵中&#xff0c;输入图像大小…

opencv模板匹配步骤及Code

opencv模板匹配步骤及Code 首先介绍一下模板匹配的适用场景&#xff1a; 1、图像检索 2、目标跟踪 简单的说&#xff0c;模板匹配最主要的功能就是在一幅图像中去寻找和另一幅模板图像中相似度最高的部分&#xff0c;这就是模板匹配。 比如&#xff0c;在下面这图片中: 我们要…

OpenCV 学习笔记(模板匹配)

OpenCV 学习笔记&#xff08;模板匹配&#xff09; 模板匹配是在一幅图像中寻找一个特定目标的方法之一。这种方法的原理非常简单&#xff0c;遍历图像中的每一个可能的位置&#xff0c;比较各处与模板是否“相似”&#xff0c;当相似度足够高时&#xff0c;就认为找到了我们的…