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 相关文章推荐
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
jquery实现动态操作select选中
Feb 11 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
详解JavaScript的while循环的使用
Jun 03 Javascript
JSON简介以及用法汇总
Feb 21 Javascript
深入理解Ajax的get和post请求
Jun 02 Javascript
angularJs中datatable实现代码
Jun 03 Javascript
JavaScript利用fetch实现异步请求的方法实例
Jul 26 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
Jul 13 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 Javascript
使用JavaScript通过前端发送电子邮件
May 22 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重新实现PHP脚本引擎内置函数
2007/03/06 PHP
php 获得汉字拼音首字母的函数
2009/08/01 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
PHP设计模式之适配器模式原理与用法分析
2018/04/25 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
在vscode里使用.vue代码模板的方法
2018/04/28 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
微信小程序实现的自定义分享功能示例
2019/02/12 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载操作
2020/08/31 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
在Python中使用列表生成式的教程
2015/04/27 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Python 创建守护进程的示例
2020/09/29 Python
利用python 下载bilibili视频
2020/11/13 Python
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
中国电视购物:快乐购
2017/02/04 全球购物
幼教简历自我评价
2014/01/28 职场文书
幼儿园家长评语大全
2014/04/16 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
大学班级学风建设方案
2014/05/01 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
邀请函格式范文
2015/02/02 职场文书
2015初中教导处工作总结
2015/07/21 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
Python正则表达式中flags参数的实例详解
2022/04/01 Python