Vue组件开发初探


Posted in Javascript onFebruary 14, 2017

注册一个组件

有两种方式可以注册一个组件,第一种是全局注册,第二种是局部注册

# 全局注册
Vue.component('my-component',{
  template: '<span>Hello</span>'
})

# 局部注册
var child = {
  template: '<span>Hello</span>'
}
new Vue({
  // ···
  components:{
    my-component: child
  }
})

注意:组件的注册必须要在Vue实例创建之前

使用组件

<div id="app">
  <my-component></my-component>
</div>

当我们需要使用到data时,data必须是一个函数,否则将会报错,这是Vue的一个规则,如下

Vue.component('my-component',{
  template: '<span>{{message}}</span>',
  data:function(){
    return {message:'hello'}
  }
})

组件间消息传递

当我们封装了组件A,但是组件A又嵌套了组件B,这时候组件AB形成了父子组件的关系,我们应该怎么来让父组件传递消息给子组件呢,这里用到了一个属性值props,如下

Vue.component('my-component',{
  props: ['message']
  template: '<span>{{message}}</span>'
})

# 通过props传递消息给子组件
<my-component message="Hello"></my-component>

上面的例子,我们通过props传递了参数给子组件,确实能改变子组件的值,但是,假如我们有这样一个要求,props的值是动态改变的,那么这种静态字面量传递参数的方式就不能满足我们的需求了。如下将说明如何进行动态的props值设定

<div id="app">
  <input v-model="parentMsg"><br>
  <my-component v-bind:message="parentMsg">
</div>

这里通过v-bind的命令,将我们的message与parentMsg进行绑定,这样,当我们的parentMsg改变时,message将能实时改变

自定义事件

父子组件之间如果通过props来传递数据的话,那么似乎只能进行单向的数据传递,只能从父组件向子组件传递,假如我们需要从子组件传递消息回去,那么就需要用到自定义事件了

# 使用v-on绑定自定义事件
Vue.component('my-component',{
  template: '<button v-on:click="increment">{{counter}}</button>',
  data: function(){
    return {counter: 0}
  },
  methods: {
    increment: function(){
      this.counter += 1;
      this.$emit(increment);
    }
  }
})
new Vue({
  el: '#app',
  data: {
    // ···
    total:0
  },
  methods: {
    // ···
    incrementTotal: function(){
      this.total += 1;

    }
  }
})
<div id="app">
  // ···
  <p>{{total}}</p>
  <my-component v-on:increment="incrementTotal"></my-component>
</div>

这里,我们点击按钮,按钮的显示的数值将会改变,同时,total的值也会动态的改变,这就是子组件回传数据的实例,我们点击按钮时,将会首先执行button的onclick方法,在onclick方法里面,通过this.$emit('increment')来执行我们自定义的事件,假如我们需要在$emit中添加参数,那么我们就要在$on()中进行回调的处理

我们接下来自定义一个表单输入控件,我们在输入框中输入信息,同时在P标签中显示出来。

这里我们平时使用的

v-model="message"

其实是下面语句的一个简化版本,也就是语法糖

v-bind:value="message" v-on:input="message = arguments[0]"

或者

v-bind:value="message" v-on:input="message = $event.target.value"

那么自定义表单控件我们需要干什么呢?

为了让v-model生效,我们需要在子组件中定义一个value的属性,还有一个监听新值产生的input事件
来看看我们的自定义控件

<my-input label="Message" :value="message" @input="message = arguments[0]"></my-input>

在上面,我们通过 :value="message" 绑定一个value使其与上一级组件的message相挂钩,后面这个 v-on:input 是子组件定义的事件,事件名可以自己定义,arguments[0] 是组件自定义时传入的第一个参数

完整代码如下:

# 使用自定义事件的表单输入控件
Vue.component('my-input',{
  template: '\
  <div>\
  <label>{{label}} :</label>\
  <input v-bind:value="value" v-on:input="onInput"></input>\
  </div>\
  '
  ,
  props:['value','label'],
  methods:{
    onInput:function(event){
      this.$emit('input',event.target.value);
      // this.$emit('input')
    }
  }

})
<div id="app">
  <p>{{message}}</p>
  <my-input label="Message" v-model="message"></my-input><br>
  <!-- <my-input label="Message" :value="message" @input="message = arguments[0]"></my-input> -->

</div>

我们在定义内部事件时,调用到了$emit(),为了让message能动态改变,我们需要将输入的参数回传回去,这样才能使外部组件与我们的表单控件显示一致

Vue组件的就先写到这,接下来还有事件分发,就接下来再写。由于理解的不同,可能有写得不好的,所以有错误的地方请指正。

Javascript 相关文章推荐
文本加密解密
Jun 23 Javascript
你必须知道的JavaScript 变量命名规则详解
May 07 Javascript
8个超实用的jQuery功能代码分享
Jan 08 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
jquery中ajax使用error调试错误的方法
Feb 08 Javascript
javascript中几个容易混淆的概念总结
Apr 14 Javascript
详谈javascript中的cookie
Jun 03 Javascript
再谈JavaScript线程
Jul 10 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
jquery获取复选框checkbox的值的简单实现方法
May 26 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
Dec 14 Javascript
vue组件化中slot的基本使用方法
May 01 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 #Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 #Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 #Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 #Javascript
Javascript下拉刷新的简单实现
Feb 14 #Javascript
Vue 短信验证码组件开发详解
Feb 14 #Javascript
JS去除字符串中空格的方法
Feb 14 #Javascript
You might like
10个实用的PHP代码片段
2011/09/02 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
2014/08/21 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php获取小程序码的实现代码(B类接口)
2020/06/13 PHP
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
python dict乱码如何解决
2020/06/07 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
卡骆驰英国官网:Crocs英国
2019/08/22 全球购物
工作表扬信的范文
2014/01/10 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
委托证明书
2014/09/17 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
质量保证书
2015/01/17 职场文书
恰同学少年观后感
2015/06/08 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android