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提交表单 Form.js官方插件介绍
Mar 01 Javascript
js实现在同一窗口浏览图片
Sep 17 Javascript
自定义刻度jQuery进度条及插件
Sep 02 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
Dec 04 Javascript
jQuery实现鼠标选文字发新浪微博的方法
Apr 02 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
使用jQuery实现购物车结算功能
Aug 15 jQuery
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
May 17 Javascript
npm配置国内镜像资源+淘宝镜像的方法
Sep 07 Javascript
JS实现横向轮播图(中级版)
Jan 18 Javascript
JS实现简易图片自动轮播
Oct 16 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
PHP实现页面静态化深入讲解
2021/03/04 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
JQuery 获取和设置Select选项的代码
2010/02/07 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Django在win10下的安装并创建工程
2017/11/20 Python
Python3实现购物车功能
2018/04/18 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
JAVA招聘远程笔试题
2015/07/23 面试题
机电一体化应届生求职信范文
2014/01/24 职场文书
高中军训感想800字
2014/02/23 职场文书
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
大学迎新生标语
2014/10/06 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2019销售早会主持词
2019/06/27 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers
使用MybatisPlus打印sql语句
2022/04/22 SQL Server