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 相关文章推荐
ExtJS 2.2.1的grid控件在ie6中的显示问题
May 04 Javascript
javascript学习笔记(八)正则表达式
Oct 08 Javascript
javascript事件模型实例分析
Jan 30 Javascript
新手快速学习JavaScript免费教程资源汇总
Jun 25 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
深入理解node.js之path模块
May 03 Javascript
jquery中有哪些api jQuery主要API
Nov 20 jQuery
JavaScript实现删除数组重复元素的5种常用高效算法总结
Jan 18 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
Django模板继承 extend标签实例代码详解
May 16 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 Javascript
基于VUE实现简单的学生信息管理系统
Jan 13 Vue.js
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
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
2010/11/11 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
Vue数组更新及过滤排序功能
2017/08/10 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Django工程的分层结构详解
2019/07/18 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
phpquery中文手册
2021/03/18 PHP
自荐书范文范例
2014/02/13 职场文书
运动会通讯稿500字
2014/02/20 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
python实现自动化群控的步骤
2021/04/11 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技
SQL Server中锁的用法
2022/05/20 SQL Server
Nginx报404错误的详细解决方法
2022/07/23 Servers