vue 进阶之实现父子组件间的传值


Posted in Javascript onApril 26, 2019

本章我们将深入了解一下组件,并实现父子组件间的传值。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <counter :count="count1"></counter>
  <counter :count="count2"></counter>
</div>
<script>
  Vue.component("counter", {
    props:['count'],
    data(){
      return{
        number: this.count,
      }
    },
    template: `
      <p>{{count}} {{number}}</p>
    `
  });
  var app = new Vue({
    el: '#app',
    data: {
      count1: 1,
      count2: 2,
    }
  })
</script>
</body>
</html>

结果如下:

vue 进阶之实现父子组件间的传值

上面的代码中我们定义了一个 counter 组件,并在 HTML 内插入了两次,分别通过 :count = "" 的方式将父组件内的 count1 和 count2 传入,然后我们在 counter 组件内通过 props 属性将 count 属性接住,这样我们就将父组件的值传递给了子组件。我们就可以在 template 的模板中将传过来的 count 数据插入,我们也可以在子组件的 data 内将传过来的 count 值赋值给一个新的变量 number。

如果从父组件传过来的值需要参与逻辑运算时我们推荐将传入的值重新赋值给一个变量,因为子组件不允许直接修改父组件传过来的值,我们可以将传入的值赋值给新的变量,然后将该变量再传给父组件来修改父组件的值。如下代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <counter :count="count1" @change="handleChange"></counter>
  <counter :count="count2" @change="handleChange"></counter>
  <p>{{total}}</p>
</div>
<script>
  Vue.component("counter", {
    props: ['count'],
    data() {
      return {
        number: this.count,
      }
    },
    methods: {
      handleClick() {
        this.number++;
        this.$emit('change', 1)
      }
    },
    template: `
      <p @click="handleClick">{{number}}</p>
    `
  });
  var app = new Vue({
    el: '#app',
    data: {
      count1: 1,
      count2: 2,
      total: 3,
    },
    methods: {
      handleChange(number) {
        this.total = this.total + number
      }
    }
  })
</script>
</body>
</html>

在以上代码中,我们在父组件中定义了一个 total 数据,初始值为 count1 + count2 的和。我们在子组件内定义了一个 handleClick() 的方法,让父组件传过来的 count 值每次都 +1,我们还在 handleClick() 的方法内定义了 this.emit( ′ change ′ ,1)的方法,它的意思是子组件通过 emit(′change′,1)的方法,它的意思是子组件通过emit 属性向外触发一个 change 事件,并且携带了一个参数 1,然后我们在 HTML 的 <counter> 标签内在父组件的 methods 属性内通过 handleChange() 方法监听这个 change 事件,即 @change 和 $emit 的事件名称自己定义,只要名称一致即可。在 handleChange() 方法内接收从子组件通过 change 事件传过来的参数 1,让后让 total 数据加上这个参数 1 即可实现一个简单的累加计算。

以上便是子组件向父组件传值的过程,结果如下:

vue 进阶之实现父子组件间的传值

从上面的例子我们已经实现了父子组件间的相互传值,是通过 change 事件将每次累加的数值 1 传给父组件,通过数据的方式修改 total 值,Vue 官方建议我们尽量通过数据的方式而不是操作 DOM 的方式来实现操作,但是在极端条件下我们必须要操作 DOM 来实现,Vue 也为我们提供操作 DOM 的方法,如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="app">
  <counter :count="count1" @change="handleChange" ref="one"></counter>
  <counter :count="count2" @change="handleChange" ref="two"></counter>
  <p>{{total}}</p>
</div>
<script>
  Vue.component("counter", {
    props: ['count'],
    data() {
      return {
        number: this.count,
      }
    },
    methods: {
      handleClick() {
        this.number++;
        this.$emit('change')
      }
    },
    template: `
      <p @click="handleClick">{{number}}</p>
    `
  });
  var app = new Vue({
    el: '#app',
    data: {
      count1: 1,
      count2: 2,
      total: 3,
    },
    methods: {
      handleChange() {
        console.log(this.$refs.one);
        console.log(this.$refs.two);
        this.total = this.$refs.one.number + this.$refs.two.number;
      }
    }
  })
</script>
</body>
</html>

上面的代码中,我们并没有通过 $emit 里的 change 事件传值给父组件,而是在 <coute> 标签内分别定义了 ref="one" ref="two"  属性,并且在 handleChange() 方法内通过监听子组件的 change 改变时打印一下这两个 ref 内的值,控制台的输出日志如下:

vue 进阶之实现父子组件间的传值

里面既包含了 $el 的 DOM,还有初始值 count=1 即handleClick() 方法执行后 number=2 的值,所以我们可以拿到 number 的值,让两个 number 相加即为 total 的值。

在 vue 中我们还是建议通过数据来操作而不是通过 DOM 来执行操作。

总结

以上所述是小编给大家介绍的vue 进阶之实现父子组件间的传值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Javascript客户端脚本的设计和应用
Aug 21 Javascript
js function定义函数使用心得
Apr 15 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
Nov 25 Javascript
artDialog双击会关闭对话框的修改过程分享
Aug 05 Javascript
Jquery中的层次选择器与find()的区别示例介绍
Feb 20 Javascript
JavaScript按值删除数组元素的方法
Apr 24 Javascript
JS实现n秒后自动跳转的两种方法
Nov 30 Javascript
JavaScript登录验证码的实现
Oct 27 Javascript
node实现简单的反向代理服务器
Jul 26 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
Sep 03 Javascript
vue flex 布局实现div均分自动换行的示例代码
Aug 05 Javascript
JS操作JSON常用方法(10w阅读)
Dec 06 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 #Javascript
配置一个vue3.0项目的完整步骤
Apr 26 #Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 #Javascript
JS异步错误捕获的一些事小结
Apr 26 #Javascript
原生JS实现图片懒加载之页面性能优化
Apr 26 #Javascript
vue请求本地自己编写的json文件的方法
Apr 25 #Javascript
vue中img src 动态加载本地json的图片路径写法
Apr 25 #Javascript
You might like
PHP 实例化类的一点摘记
2008/03/23 PHP
javascript 写类方式之八
2009/07/05 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
jquery将json转为数据字典的实例代码
2019/10/11 jQuery
JavaScript数组去重实现方法小结
2020/01/17 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
Python检测一个对象是否为字符串类的方法
2015/05/21 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Python调用Windows命令打印文件
2020/02/07 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
HTML5图片预览实例分享
2014/06/04 HTML / CSS
计算机应用专业毕业生求职信
2013/10/24 职场文书
CNC数控操作工岗位职责
2013/11/19 职场文书
白酒业务员岗位职责
2013/12/27 职场文书
毕业自我评价
2014/02/05 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
公司收款委托书范本
2014/09/20 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python