4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理需求分析:通过输入框,双向绑定文本框显示。<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><title>Title</title></head><body><divid=”app”><cpn:number1=”num1″:number2=”num2″/>&lt

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

? 作者简介:哪吒,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、浏览器显示

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

错误信息

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、监听事件,反向赋值

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

 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、浏览器显示

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

三、联动修改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、浏览器显示

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

四、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>

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

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

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

4.vue 的双向绑定的原理是什么?_vue双向绑定底层原理

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180641.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • b站动漫_python爬b站视频

    b站动漫_python爬b站视频。。闲来无事,爬了一下我最爱的B站~~~卒首先进入B站的番剧索引页ps:以前经常浏览这个索引页找动漫看,所以熟练的操作~滑稽翻页发现url链接并没有改变,用谷歌开发者工具network发现加载了XHR文件并返回json格式的响应要对其进行翻页处理,观察一下querystring的规律,发现那么多个参数只有page这个参数是变化的所以接下来都很好做了~嘻嘻items.pyimp…

    2022年8月23日
    6
  • 最全各国人口数据,人口的高出生率与高死亡率竟然是这些国家

    最全各国人口数据,人口的高出生率与高死亡率竟然是这些国家欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。作者:挖数腾讯数据产品经理&amp;段子手个人微信公号:w…

    2025年9月12日
    12
  • 天翼网关设置为桥接模式_天翼网关桥接模式

    天翼网关设置为桥接模式_天翼网关桥接模式前两年将家里的电信宽带升级到光纤,光猫也随之进行了升级,当时升级好后,电信工作人员介绍说新的光猫带有wifi功能,如果连接路由器可以不用配置路由器的拨号设置,说是升级到光纤后可以直接连接网线上网,不用再拨号了。当时也没怎么在意,网线连上路由器之后,果然没做宽带的账号设置就可以正常上网了。最近在使用一个软件客户端的时候需要设置宽带拨号的方式更换IP才能使用某个功能,然后才发现家里的宽带升级到光纤后,无法使用原来的拨号方式上网了。通过网络搜索,是因为升级光纤后,将连接的模式设置为路由模式,导致无法使用拨号上

    2025年7月15日
    4
  • 计算机网络之TCP/UDP协议详解[通俗易懂]

    计算机网络之TCP/UDP协议详解[通俗易懂]深度理解TCP/IP1.TCP基础知识1.1什么是TCP?1.2什么是TCP连接?1.3TCP协议段格式1.4TCP主要特点2.UDP基础知识2.1UDP是什么?2.2UDP的协议段格式2.3UDP的主要特点2.4UDP的缓冲区3.TCP和UDP区别总结4.TCP保证可靠的机制4.1重传机制(这里只说了超时重传)4.2滑动窗口4.3流量控制4.3拥塞控制1.TCP基础知识1.1什么是TCP?TCP是⾯向连接的、可靠的、面向字节流的传输层通信协议面向连接:只能一对一连接,

    2022年5月9日
    36
  • TASK异步进程处理场景[通俗易懂]

    TASK异步进程处理场景

    2022年2月13日
    49
  • python 404_python检测404页面

    python 404_python检测404页面某些网站为了实现友好的用户交互,提供了一种自定义的错误页面,而不是显示一个大大的404,比如CSDN上的404提示页面如下:这样虽然提高了用户体验,但是在编写对应POC进行检测的时候如果只根据返回的HTTP头部信息判断,则很可能造成误报,为了能准确检测到404页面,需要从状态码和页面内容两个方面来进行判断。从状态码来判断比较简单。可以直接使用requests库发送http请求,得到响应码即可。从…

    2022年7月27日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号