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 相关文章推荐
让Firefox支持event对象实现代码
Nov 07 Javascript
javascript最常用与实用的创建类的代码
Aug 12 Javascript
判断文件是否正在被使用的JS代码
Dec 21 Javascript
学习JavaScript编程语言的8张思维导图分享
Mar 27 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
Javascript字符串拼接小技巧(推荐)
Jun 02 Javascript
100行代码理解和分析vue2.0响应式架构
Mar 09 Javascript
React组件之间的通信的实例代码
Jun 27 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
Oct 25 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
Apr 25 Javascript
vue数据响应式原理知识点总结
Feb 16 Javascript
微信小程序webSocket的使用方法
Feb 20 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
mysql5写入和读出乱码解决
2006/11/25 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
JavaScript制作淘宝星级评分效果的思路
2020/06/23 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
JavaScript如何禁止Backspace键
2015/12/02 Javascript
原生JS实现几个常用DOM操作API实例
2017/01/19 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
JS端基于download.js实现图片、视频时直接下载而不是打开预览
2020/05/09 Javascript
jQuery带控制按钮轮播图插件
2020/07/31 jQuery
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
Python 2与Python 3版本和编码的对比
2017/02/14 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python str字符串转uuid实例
2020/03/03 Python
500行python代码实现飞机大战
2020/04/24 Python
python爬虫请求头设置代码
2020/07/28 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
python中使用asyncio实现异步IO实例分析
2021/02/26 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
公务员总结性个人自我评价
2013/12/05 职场文书
写给保洁员表扬信
2014/01/08 职场文书
校园文化标语
2014/06/18 职场文书
2014年党总支工作总结
2014/12/18 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
用Python将GIF动图分解成多张静态图片
2021/06/11 Python