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 相关文章推荐
jQuery的Ajax的自动完成功能控件简要说明
Feb 22 Javascript
js/jquery解析json和数组格式的方法详解
Jan 09 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
jQuery实现可移动选项的左右下拉列表示例
Dec 26 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
vue组件横向树实现代码
Aug 02 Javascript
js正则匹配多个全部数据问题
Dec 20 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 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
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
2016/07/06 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
实例讲解python函数式编程
2014/06/09 Python
wxpython中利用线程防止假死的实现方法
2014/08/11 Python
Python生成随机验证码的两种方法
2015/12/22 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
解决pycharm运行出错,代码正确结果不显示的问题
2018/11/30 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
汉森冲浪板:Hansen Surfboards
2018/05/19 全球购物
大专毕业生自我评价分享
2013/11/10 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
支部鉴定材料
2014/06/02 职场文书
语文复习计划
2015/01/19 职场文书
2015年小学开学寄语
2015/02/27 职场文书
责任书范本大全
2015/05/11 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis