vue总结系列 ------ 组件之间的传值

2023-05-16

原因

半年前开始学Vue学到了今天,也没有机会好好整理一下自己的知识点,因为上公司的项目不是依赖于Vue,还是在用JQ,和文件之间来传递代码,所以其实在对vue的学习成面上来讲对我的帮助并不大,来了新的一家公司,觉得吧自己会的东西全部整理一下,第一篇---组件之间的传值

一般书上都先说父向子传递,为什么我们要先说这个呢?为什么呢?因为其他的书上都是这样讲的?对其他书,博客都是先写这个我认为不对,虽然这个是看上去简单,注意是看上去,所以我们先讲的是 -- 组件之间的传值,为什么我们要这样呢?因为既然是总结就要先主线在分支,那有人就要说了-父向子传递是特殊的分支吗?答案是的?所以我们先讲 -- 组件之间的传值

以下是在非vue脚手架的情况下操作的

组件之间的传值

我们在不管他们2个组件之间是什么关系,我们就是说出现了2个组件,我们直接要传值我们要怎么办呢?

我们要自定义事件,在通过事件之间的传递参数来达到我们想要的效果

那我们先来学习自定义事件:

this.$emit('my-event')  对
this.$emit('myEvent')   错

但是我们需要注意的是这里事件名字不可以用camelCase驼峰式的写法,因为:

 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成v-on:myevent——导致 myEvent 不可能被监听到 ; 而不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性名,就直接使用了  ----vue官网

我们知道了自定义事件,那么我们就要去监听这个事件:

监听用$on()

这里要解释一下他们直接的关系:就是在某一个地方,写了自定义事件这一行代码,那么我们就立马执行监听这个事件的函数

自定义事件:第一的参数是自定义事件名,第二的是传递的参数

监听事件:第一个参数是监听的事件名,第二个是需要执行的函数,方法

(下面有案例)

大家想一下我们可以用一个对象来又存自定义事件,又存监听这个事件:也就中央事件总线(中介)

我们可以来看一个案例,大家可以ctrl+c看一下效果

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<style>
  .father {
    cursor: pointer;
  }
</style>
<body>

  <div id="app">
    <father :count="2"></father>
    <father :count="3"></father> <!-- //定义的时候名称不区分大小写 -->
    <div>{{totol}}</div>
  </div>

  <script src="js/vue.js"></script>
  <script>
    var Event = new Vue();
    Vue.component('father', {
      props: ['count'],
      template: `
		<div class = "father">
		    <p @click = 'addCount'>{{getCount}}</p>
		</div>
	`,
      data: function () {
        return {
          getCount: this.count,
        }
      },
      methods: {
        addCount: function () {
          ++this.getCount;
          Event.$emit('sendclick', 1);
        }
      },
    })
    new Vue({
      el: '#app',
      data: {
        totol: 5,
      },
      mounted: function () {
        self = this;  //作用域的问题,这里的作用域变成了Event这个对象
        Event.$on('sendclick', function (data) {
          self.totol += data;
        });
      }


    })
  </script>
</body>

</html>

这个是一个小demo:每点击一下数字数字加1,2个数他们就重新相加的一个案例

首先我们要知道:定义和监听必须的在同一个对象上或父子组件

在上面的代码定义的是father的子组件作用域,监听的是全局作用域,由于是在不用的作用域所以定以一个相同的作用域的对象,并且拥有vue对象的方法

这里就是当我们的数字加1了我们就会1触发自定义的$emit,那么系统就会去找是否有人监听了$emit中的这个事件,如果有就会发生执行 $on中的函数,这里需要注意的是,这里触发的函数中的this是我们定义的Event这个对象,而不是我们new Vue({})的那个对象,所以this要转换一下

子向父亲(全局)传递值

我们在来看看特殊的,同样一个demo,但是因为是子向父亲传递值的另一种写法(观察者模式)

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
</head>
<style>
  .father {
    cursor: pointer;
  }
</style>

<body>

  <div id="app">
    <father :count="2" @sendclick="send"></father>
    <father :count="3" @sendclick="send"></father> <!-- //定义的时间名称不区分大小写 -->
    <div>{{totol}}</div>
  </div>

  <script src="js/vue.js"></script>
  <script>
    Vue.component('father', {
      props: ['count'],
      template: `
			<div class = "father">
				<p @click = 'addCount'>{{getCount}}</p>
			</div>
			`,
      data: function () {
        return {
          getCount: this.count,
        }
      },
      methods: {
        addCount: function () {
          ++this.getCount;
          this.$emit('sendclick', 1);
        }
      }
    })
    new Vue({
      el: '#app',
      data: {
        totol: 5,
      },
      methods: {
        send: function (data) {
          this.totol += data;
        }
      }
    })
  </script>
</body>

</html>

这里就是说我们子组件自定义了一个事件sendclick,在我们父组件上可以直接用@sendclick来监听他,带到了相同的效果

因为是父子组件所以可以直接监听

平行的组件传值

也可以用上面的中央事件总线的写法

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <div id="app">
    <module></module>
    <analysis></analysis>
  </div>
  <script src="js/vue.js"></script>
  <script>
    //定义一个中央事件总线
    var Event = new Vue();
    Vue.component('module', {
      template: `
	    <div>
		我说:<input @keyup = 'on_changes' type='text' v-model = 'aa'>
	    </div>	
		`,
      data: function () {
        return {
          aa: ''
        }
      },
      //$emit : Event触发一个事件chaunz名,传过去了this.aa的参数,后面的$on接收到了反应,触发了回调函数
      methods: {
        on_changes: function () {
          Event.$emit('chaunz', this.aa);
        }
      }

    })
    Vue.component('analysis', {
      template: `
			<div>
				花花他说了:<p>{{huahua_said}}</p>
			</div>	
			`,
      data: function () {
        return {
          huahua_said: ''
        }
      },
      mounted: function () {
        self = this;
        // 作用域变了
        Event.$on('chaunz', function (data) {
          self.huahua_said = data;
        })
      }

    })
    new Vue({
      el: '#app',
      data: {

      }
    })
  </script>

</body>

</html>

大家可以ctrl+c看下其实是很好理解的就是一个触发了,一个就立马监听,在注意一下事件的作用域就好了

父亲向子传递值

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>父子组件之间的传递</title>
</head>

<body>
  <div id="app">
    <father :itme='list'></father>
  </div>
  <script src="js/vue.js"></script>
  <script>
    Vue.component('father', {
      props: ['itme'],
      template: '<div><li v-for = "lis in itme">{{lis}}</li></ul>',

    });
    var app = new Vue({
      el: "#app",
      data: {
        list: {
          firstName: 'John',
          lastName: 'Doe',
          age: 30
        }
      }
    })


  </script>

</body>

</html>

这里大家需要注意的是这里父亲向子传递的是属性中的值(属性值),那么需要传递的属性名称写在props这个属性值中的数组中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue总结系列 ------ 组件之间的传值 的相关文章

  • 对js动画和时间控制的使用

    JavaScript Document 打算移动的元素ID xff1b elementID 该元素的目的地的 34 左 34 位置 xff1b final x 该元素的目的地的 34 上 34 位置 xff1b final y 停顿时间 x
  • css动画小结

    一 转换 transform IE9 43 1 旋转rotate transform rotate 30deg ms transform rotate 30deg IE 9 webkit transform rotate 30deg Saf
  • Django 判断访问来源是PC端还是手机端

    pc or mobile py 判断访问来源是pc端还是手机端 import re def judge pc or mobile ua 34 34 34 param ua 访问来源头信息中的User Agent字段内容 return 34
  • 圆形进度条是学习

    学习网站 xff1a http www cnblogs com jr1993 p 4677921 html CSS margin 0px padding 0px box margin 50px auto 0 width 300px heig
  • 定位插件

    写了个等位插件 xff0c 点击nav中的LI xff0c 位移 xff08 与href有视觉效果 xff09 到达相应板块 xff08 这里的类比li中的类中多了个H字母 xff09 的位置 lt li class 61 34 wz 34
  • JQ复习

    一选择器 1 基本选择器 2 层级选择器 3 过滤选择器 first 选取第一个元素 last 选择最后一个元素 not 去除所有与给定选择器匹配的元素 39 input not first 39 even选取索引是偶数的元素 xff0c
  • 第7章艺术编程Ajax的学习

    终于学到Ajax以前一直没接触到一直以为很NB xff0c 对这些内容我基本上是个小白中的小白哎 xff0c 继续加油 Ajax可以做到只更新页面的一下部分 xff0c 其他部分不需要重新加载 下面就是根据书上的内容所写 HTML lt d
  • 函数是否加括号的问题

    lt a onclick 61 34 fun 34 gt lt a gt 这里有括号 document getElementById 34 ID 34 onclick 61 fun 这里不可以有括号 为什么会有这样的不同 首先加上括号是执行
  • this的详细分析加案例

    this对象是在函数运行时候基于函数的执行环境 xff08 上下文 xff09 绑定的 方法调用模式函数调用模式改造器调用模式apply call bind调用模式 1 方法调用模式 函数有所属对象 xff0c 也就是这个函数是myObje
  • 构造函数与原型链和面向对象的学习(一)

    什么是构造函数 构造函数就是一个普通的函数 xff0c 里面可以写任何语句 逻辑语句或DOM操作 xff0c 可以new出新的实例 xff0c 使其实例可以共享构造函数的原型 第一个例子 function Fun this name 61
  • 构造函数与原型链和面向对象的学习(二)

    原型链 proto proto 也就是对象的 prototype 属性 每一个函数都有一个属性叫做prototype 指向一个对象 不是函数就没有这个属性 这个对象叫原型对象 当这个构造函数被new的时候 xff0c 他的每一个实例对象的
  • 构造函数与原型链和面向对象的学习(三)

    小案例 xff08 红绿灯 xff09 下面对面向对象写个小案例 xff08 红绿灯 xff09 上面是原图 用来来实现点击图片 xff0c 红绿灯的颜色改变 xff0c 控制背景图片的定位来改变 点击一下 就是要完成上面的效果 如果只要实
  • js中的预编译和作用域链

    预编译目的 1 定义作用域中的初始化词法环境 xff0c 而词法环境中有定于作用域 xff0c 从而规定了变量的作用域 2 先是在为undefined xff0c 减少运行时报错 形参去实参的区别 1 形参变量只有在被调用时才分配内存单元
  • ffmpeg视频处理神器学习基础笔记

    FFmpeg文档汇总 xff1a https ffmpeg org documentation html FFmpeg filters文档 xff1a https ffmpeg org ffmpeg filters html 视频处理 视频
  • Vue.js动画和过渡

    vue中的过渡与动画 过滤 把需要添加动画效果的DIV放到transition标签 之后就会发生以下3个步骤 自动嗅探目标元素是否应用了 CSS 过渡或动画 xff0c 如果是 xff0c 在恰当的时机添加 删除 CSS 类名 等下要写的6
  • Vue.js使用keyframes动画

    lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt title gt lt scrip
  • Vue.js使用animate.css框架

    1 如何使用animate框架 lt DOCTYPE html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt Vue中css动画的原理 lt t
  • vue.js中添加动画

    通过触发事件 xff0c 改变data中的值 xff0c 或者改变点击标签元素上的属性值 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 6
  • 多个元素和列表的过渡

    多个元素 lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt 多个元素的组件的过渡动
  • flex弹性布局的学习

    布局的传统解决方案是基于盒状模型 xff0c 依赖 display 43 position 43 float 方式来实现 xff0c 灵活性较差 2009年 xff0c W3C提出了一种新的方案 Flex xff0c Flex是Flexib

随机推荐

  • 震惊!Ajax项目中的使用

    啊啊 xff01 实习第一天写了个移动端的分享列表 就在第三天我们的技术大佬亲自教我们如何对接后台 当然用的是我写的移动端的分享列表 虽然这次应用不是很深入 xff0c 但还是比较广泛 用到了Ajax xff0c sui框架 zepto x
  • 关于viewport视口的学习

    简单来说 lt meta name 61 34 viewport 34 content 61 34 width 61 device width initial scale 61 1 0 34 gt content属性值 width 可视区域
  • 淘宝的H5布局

    利用viewport和rem布局实现的淘宝布局 下面先看看em布局的原理 em作为font size的单位时 xff0c 其代表父元素的字体大小 xff0c em作为其他属性单位时 xff0c 代表自身字体大小 MDN em作为字体单位 x
  • css的优先级

    优先级 浏览器通过优先级来判断哪些属性值与一个元素最为相关 xff0c 从而在该元素上应用这些属性值 优先级是基于不同种类选择器组成的匹配规则 优先级是如何计算的 优先级就是分配给指定的 CSS 声明的一个权重 xff0c 它由 匹配的选择
  • Django设置分享到微信好友和朋友圈时的标题、摘要、链接和图片

    主要参考官方文档 1 前端分享给好友和朋友圈的js代码 share html lt DOCTYPE html gt lt html lang en gt lt head gt lt meta charset UTF 8 gt lt meta
  • 孙其功陪你学之——如何将shell命令的返回值赋值给应用程序的变量

    如何将shell命令的返回值赋值给应用程序的变量 博主最近做了个路由器的项目 xff0c 需要得到路由器现在网络状态和参数 xff0c 使用UCI get 获得 xff0c 但是使用了system xff08 UCI get xff09 之
  • shell编程2条件语句

    文章目录 shell编程之条件语句1 条件测试1 1 返回值1 2 test 2 文件测试3 整数值比较4 逻辑测试5 if语句5 1 单分支 if 语句5 2 双分支 if 语句5 3 多分支 if 语句 6 case 语句7 实验7 1
  • html和css的hack的学习

    在整理基础的时候总结 html和css的hack的学习 hack是什么 xff1f 就是针对不同的浏览器写不同的css样式让各浏览器能达到一致的渲染效果 xff0c hack分为HTML和CSS HTML hack lt if lte IE
  • 数组的迭代与归并的方法

    迭代的作用 xff1a 减少代码量 xff1a 例如因为map xff0c filter方法会自动生产数组不用自己在for创建 xff0c 有利于性能优化 xff1b 和无需知道对象的长度 补充19 6 11 xff1a 迭代的方法是表达式
  • js数组的常见属性和方法

    属性 strong length strong 是Array的实例属性 返回或设置一个数组中的元素个数 该值是一个无符号 32 bit 整数 xff0c 并且总是大于数组最高项的下标 xff0c 不只是可读 Array prototype
  • js闭包的作用和应用的学习

    什么是闭包 一个函数和对其周围状态 xff08 lexical environment xff0c 词法环境 xff09 的引用捆绑在一起 xff08 或者说函数被引用包围 xff09 xff0c 这样的组合就是闭包 xff08 closu
  • css面试题布局

    不试试怎么知道自己行不行 昨天加了张鑫旭的微信 xff0c 我草贼开心 xff0c 发现他星期六会直播 xff0c 一下就是我看直播学到的一些总结 那么是什么呢 xff1f 其实就是一个简单的左右排版 xff0c 在张老师的讲了4种不是很好
  • 获取css的方法区别

    不试试怎么知道自己不可以 xff1f 对吧 首先我们要知道css在HTML中有多少总方法 xff1f 呵呵大家都知道的 行内 xff1a 顾名思义就是和标签在同一行 lt div class 61 34 text 34 style 61 3
  • 关于offsetLeft和offsetTop的兼容性问题

    不试一下怎么知道自己不可以 xff1f 首先我们要看下offsetLeft和offsetTop他们两的API的作用 xff1b 元素相对于offsetParent的左边距和上边距 xff08 为什么没有bottom xff0c right呢
  • js深度拷贝和浅度拷贝的深入理解

    首先我们来说说什么是拷贝 xff1a 就是复制的同时加上了传值 然后问题就来了什么是有深度的什么是浅度的 xff0c 在想要了解我们这个问题之前我们先来了解一下下面的一个知识点 基本类型传递 xff0c 引用类型传递 首先我们来看下基本类型
  • npm的基本使用

    npm的下载 npm的下载其实就是把node js 百度下node官网 下载好了那么npm就附带下载好了 检查是否下载好 window 43 r 后输入cmd打开终端 xff0c 在终端中输入node v xff1b npm v 他们会输出
  • 从 (a==1&&a==2&&a==3) 成立中看javascript的隐式类型转换

    几天上班看到一个题目就是 if a 61 61 1 amp amp a 61 61 2 amp amp a 61 61 3 console log 34 a等于什么才会输出这一句话呢 xff1f 34 当a为什么的时候输出 xff1a a等
  • Bootstrap实用功能总结

    导航栏 xff1a navbar 导航栏容器可以包含以下几个常用组成 xff1a 1 品牌LOGO xff08 navbar brand xff09 2 导航菜单 xff08 navbar nav xff09 3 导航文本 xff08 na
  • 微信小程序的AJAX初次体验

    GET请求 微信小程序用GET传送数据 微信小程序通过 wx request发送ajax请求 wx request url app globalData pubSiteUrl 43 39 user information get infor
  • vue总结系列 ------ 组件之间的传值

    原因 半年前开始学Vue学到了今天 xff0c 也没有机会好好整理一下自己的知识点 xff0c 因为上公司的项目不是依赖于Vue xff0c 还是在用JQ 和文件之间来传递代码 xff0c 所以其实在对vue的学习成面上来讲对我的帮助并不大