Vue组件化通讯的实例代码


Posted in Javascript onJune 23, 2017

1. Vue的组成文件(.vue)

分为三部分,分别对应html,js,css

<template></template>

<script></script>

<style></style>

2. Vue的生命周期函数

  1. beforeCreate() 创建数据之前
  2. created() 创建数据 我们在这里的得到我们在data里面创建的数据
  3. beforeMount() // Dom渲染完成前
  4. mounted() //Dom渲染完成
  5. beforeUpdate() // 更新视图 在beforeUpdate触发时,视图已经更新完成
  6. Updated() //更新数据调用的函数、。
<div id='app'>

 <p>{{msg}}</p>
 <input type='text' v-model='msg'>
</div>


var app = new Vue({
 el: '#app',
 data() {
  return {
   msg: 1
  }
 },
 beforeCreate() {
  console.log('beforeCreate', this.msg); //beforeCreate undefined
  console.log('beforeCreate: ', document.getElementsByTagName('p')[0]) //beforeCreate <p>{{msg}}</p>
 },
 created() {
  // 创建数据
  console.log('created', this.msg); //beforeCreate 1 
  console.log('created: ', document.getElementsByTagName('p')[0]) //beforeCreate <p>{{msg}}</p>
  // 异步处理得到渲染的dom数据
  setTimeout(() => {
   this.msg = 100
   console.log('nextTick', document.getElementsByTagName('p')[0]) 
  }, 100)
  // nextTick <p>100</p>
 },
 beforeMount() {
  console.log('beforeMount', this.msg) //beforeMount 1
  console.log('beforeMount: ', document.getElementsByTagName('p')[0]) // beforeMount <p>{{msg}}</p>
 },
 mounted() {
  // 渲染dom
  console.log('mounted', this.msg) //mounted 1
  console.log('mounted: ', document.getElementsByTagName('p')[0]) //mounted <p>1</p>
 },
 beforeUpdate() {
  console.log('beforeUpdate', this.msg) //beforeUpdate 100
  console.log('beforeUpdate: ', document.getElementsByTagName('p')[0]) //beforeUpdate <p>100</p>
 },
 updated() {
  console.log('updated', this.msg) // updated 1
  console.log('updated: ', document.getElementsByTagName('p')[0]) // updated <p>100</p>
 }
})

3. export default

每一个模块都是自己的作用域,相应的属性来处理数据和函数

data(声明数据,可以是函数和属性)

类型:Object | Function

组件只接受函数

// 对象的形式
  export default{
   data: {
    a:1
   }
  }
  // 函数的形式
  export default{
   data(){
    return {
     a: 1
    }
   }
  }

methods(一些指令和其他属性的调用方法)

  1. 不要用箭头函数来写里面的函数
  2. this指向Vue的实例
export default{
  methods: {
   plus() {
    this.a++
   }
  }
 }

1、components (组件化定义)

类型: Object

自定义元素,增加代码的复用性

// 当我们引用一个.vue文件的时候,就像使用这个文件来充当我们主体的一部分
 <div>
   <hello></hello> 
 </div>

 import hello from './hello.vue'
 export default {
  components: {
   hello
  }
 }

2、computed(计算属性)

  1. 计算属性的结果会被缓存,依赖的数据发生变化才会重新渲染
  2. 注意计算属性和methods,watch的区别
{{this.total}} //[3,4]
<button @click='add'>添加数据</button> //点击会更新this.total  

export default {
 data: () => ({
  a: 1,
  b: [2,3]
 }),
 methods: {
  add(){
   this.b.push(8);
  }
 },
 computed: {
  total(){
   return this.b.map((item)=>{
    return item+this.a
   })
  }
 }
}

watch(监听对应的数据)

  1. 键值对。键是我们需要监督的数据,值是相应的回调函数
  2. 回调函数接受2个参数,新的值和旧的值(对于数组和对象不会出现旧值,对于简单的数据会出现旧值)
  3. 监听对象的内部值变化,需要添加deep:true(数组不用)
// 点击后相应的变化
data(){
  return {
   a: 1,
   b: [2,4,6],
   c:{name:'hcc',age:22}
  }
 },
methods: {
  add(){
   this.a++
   this.b.push(8)
   this.c.name = 'yx'
  }
 },
watch: {
  b: function(val, oldVal){
    console.log('new', val) //[2,4,6,8]
    console.log('new', oldVal) //[2,4,6,8]
  },
  a: function(val, oldVal){
   console.log(val); //2
   console.log(oldVal); //1
  },
  c:{
   handler(val){
    console.log(val); //{name: 'yx',age: 22}
   } 
  }
},

props(用于接受父组件传来的数据)

  1. 规定和接受父组件的数据
  2. 单向数据流,子组件不能修改传递过来的数据
  3. 对象和数组是引用类型,指向同一个内存空间,如果 prop 是一个对象或数组,在子组件内部改变它会影响父组件的状态。
  4. 可以规定接受的数据类型和默认值,如果是对象和数组,默认值导出是一个函数
// 父组件

<hello :formParent='num'></hello> //html
components: {
 hello
},
data(){
 return {
  num: 3
 }
}

//子组件
//1. 数组规定接受的数据
props: ['hello']
//2. 验证的方式
props:{
 hello: Number,
 hello: [String, Number],
 hello: {
  type: Object,
  default(){
   return {message: 'hello'}
  }
 }
}

v-on和v-emit(子组件向父元素传递数据)

vm.$emit: 子元素向父元素定义讯号和传递数据

this.$emit('规定的讯号名称', '想传递给父元素的数据')

vm.$on: 监听讯号,并触发相应的函数(函数内部不用传参)

@'规定的讯号名称'='调用自己组件的方法并可以接受传递的参数'

// 子组件
data () {
 return {
  msg: 'Welcome to Your Vue.js App'
 }
},
methods: {
 change(){
  this.$emit('sendMsg',this.msg) //把msg传递给父组件
 }
}

// 父组件
// 引入子组件,并定义components
components: {
 hello
},
methods: {
 show(msg){   // 这里接受子组件传递的参数
  console.log(msg);
 }
}

<hello @sendMsg='show'></hello> // 这里不用传递参数,不然会覆盖子元素传递的参数

ref(用来获取dom和子组件)

  1. 可以用来操作dom<p ref="p">hello</p>
  2. 可以用来组件中的通讯
  3. 在组件中使用的this.refs是一个对象,包含了所有的绑定了的dom和子组件
// html 
 <h1 ref="myElement">这是一个dom元素</h1> //dom元素
 <hello :propnum="propnum" :obj='d' @getson='getMsg' ref='child'></hello> // 子组件
 >-- 组件中this.refs => {myElement: h1, child: VueComponent}

// 运用(在父元素中调用子元素的方法)
// html 
<hello ref='child'></hello> 
// 子元素hello
 methods: {
  change() {
   this.$emit('getson',this.msg)
   this.obj.name = 'yx'
  },
   drop(el) {
    el.style.background = 'red';
   }
 },

// 父元素
methods: {
 add() {
  console.log(this.refs); //{child: VueComponent}
  this.$refs.child.drop('这里传递父元素的dom节点')
 }
}

//如果有一个需求是,一个父元素有2个子组件,其中一个子组件的方法要调用另一个子组件的dom元素
//1. 一个子组件需要向父组件发送元素this.$emit('方法名',dom)
//2. 父元素接受到子组件的传递得到对应dom
//3. 父元素通过this.$refs调用对应的另一个子组件的方法并传入参数
// 子元素hello和world
 <div class="world">
  <h1 ref="world">这是world的dom元素</h1>
  <button @click='send'>给父元素传递dom</button>
 </div>
 methods: {
  send(){
   this.$emit('give',this.$refs.world); //给父元素发送dom
 } 
 <div class='hello'>
  <button>改变dom</button>
 </div> 
 methods: {
  changeDom(target){
   console.log(target)
  }
 }

 // 父元素
 <world @give='父亲自己的方法'></world>
 <hello ref='helloChild'></hello>
 methods: {
  // 这里接受子元素传递过来的dom元素
  '父亲自己的方法'(target) {
   this.refs.helloChild.changeDom(target) //调用另一个子元素的方法,并把dom传递过去
  }
 }

​以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery点击页面任何区域实现鼠标焦点十字效果
Jun 21 Javascript
jquery操作angularjs对象
Jun 26 Javascript
javascript针对cookie的基本操作实例详解
Nov 30 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
Jan 11 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
Jul 26 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
Sep 26 Javascript
vue实现双向绑定和依赖收集遇到的坑
Nov 29 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
Jul 16 Javascript
JavaScript字符串检索字符的方法
Jun 23 #Javascript
Angular2 组件通信的实例代码
Jun 23 #Javascript
js实现文字列表无缝滚动效果
Jun 23 #Javascript
jquery图片放大镜效果
Jun 23 #jQuery
Avalonjs双向数据绑定与监听的实例代码
Jun 23 #Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
Jun 23 #Javascript
微信小程序与php 实现微信支付的简单实例
Jun 23 #Javascript
You might like
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
laravel请求参数校验方法
2019/10/10 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jquery解析xml字符串简单示例
2014/04/11 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
Echarts实现多条折线可拖拽效果
2019/12/19 Javascript
js实现微信聊天效果
2020/08/09 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python字典操作实例详解
2017/11/16 Python
Win8下python3.5.1安装教程
2020/07/29 Python
Python 制作查询商品历史价格的小工具
2020/10/20 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
毕业生多媒体设计求职信
2013/10/12 职场文书
学校办公室主任职责
2013/12/27 职场文书
人事专员的岗位职责
2014/03/01 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
2016年教师学习廉政准则心得体会
2016/01/20 职场文书
世界上超棒的8种逻辑思维
2019/08/06 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
Python采集壁纸并实现炫轮播
2022/04/30 Python