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 相关文章推荐
JS 获取span标签中的值的代码 支持ie与firefox
Aug 24 Javascript
Javascript中判断变量是数组还是对象(array还是object)
Aug 14 Javascript
jQuery mobile 移动web(6)
Dec 20 Javascript
Bootstrap3学习笔记(三)之表格
May 20 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
jquery动态添加带有样式的HTML标签元素方法
Feb 24 jQuery
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
uni app仿微信顶部导航条功能
Sep 17 Javascript
基于JS实现table导出Excel并保留样式
May 19 Javascript
Vue组件间数据传递的方式(3种)
Jul 13 Javascript
javascript实现贪吃蛇游戏(娱乐版)
Aug 17 Javascript
让Vue响应Map或Set的变化操作
Nov 11 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
SONY ICF-SW7600的电路分析
2021/03/02 无线电
php 中的4种标记风格介绍
2012/05/10 PHP
PHP的PSR规范中文版
2013/09/28 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
javascript实现input file上传图片预览效果
2015/12/31 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python实现指定字符串补全空格的方法
2015/04/30 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
Python dict和defaultdict使用实例解析
2020/03/12 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
2014年平安建设工作总结
2014/11/19 职场文书
2014年档案室工作总结
2014/12/01 职场文书
考试作弊检讨
2015/01/27 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang