查看 原文站点,更多扩展内容及更佳阅读体验!
数字输入框只能输入数字,并且有两个快捷按钮,能够直接减1或加1。除此以外,还能够设置初始值、最大/小值,在数值改变时,触发一个自定义事件来通知父组件。css
目录文件:html
index.html
入口页input-number.js
数字输入框组件index.js
根实例先在template
里定义组件的根节点,由于是独立组件,因此应该对每一个prop
进行校验。git
接下来,先在父组件引入input-number
组件。github
value
是一个关键的绑定值,使用v-model
。大多数的表单组件都应该有一个v-model
,好比输入框、单选框、多选框、下拉选择器等。数组
Vue组件时单向数据流,没法从组件内部直接修改prop value
的值。async
解决办法是给组件声明一个data
,默认引用value
的值,而后在组件内部维护这个data
。函数
Vue.component('input-number', { data() { return { currentValue: this.value } } });
这样只解决了初始化时引用父组件value
的问题,可是若是从父组件修改了value
,input-number
组件的currentValue
也要一块儿更新。this
监听(watch
),watch
选项用来监听某个prop
或data
的改变,当它们发生变化时,就会触发watch
配置的函数,从而完成业务逻辑。代理
从父组件传递过来的value
可能不符合当前条件(大于max
,或小于min
),因此在methods
中写了一个方法updateValue
,用来过滤出一个正确的currentValue
。code
watch
监听的数据的回调函数有2个参数可用,第一个是新的值,第二个是旧的值。
在回调函数里,this
指向当前组件实例。因此能够直接调用this.updateValue()
,由于Vue代理了props
、data
、computed
及methods
。
监听currentValue
的回调里,this.$emit('input',val)
在使用v-model
时改变value
,this.$emit('on-change',val)
是触发自定义事件on-change
,用于告知父组件数字输入框的值有所变化。
在生命周期mounted
钩子里也调用了updateValue()
方法,是由于第一次初始化时,也对value
进行了过滤。
input
绑定了数据currentValue
和原生的change
事件,在句柄handleChange
函数中,判断了当前输入的是否时数字。
<p data-height="365" data-theme-id="0" data-slug-hash="oyzBWM" data-default-tab="html,result" data-user="whjin" data-embed-version="2" data-pen-title="Vue组件实例" class="codepen">See the Pen Vue组件实例 by whjin (@whjin) on CodePen.</p>
<script async src="https://static.codepen.io/ass...;></script>
每一个标签页的主体内容由使用组件的父级控制,这部分是一个slot
,并且slot
的数量决定标签切换按钮的数量。
文件目录:
index.html
入口页style.css
样式表tabs.js
标签页外层的组件tabspane.js
标签页嵌套的组件panepane
须要控制标签页内容的显示与隐藏,设置一个data:show
,而且用v-show
指令来控制元素。
getTabs
是一个公用的方法,使用this.$children
来取到全部的pane
组件实例。
在methods
中使用了有function
回调的方法时,在回调内的this
再也不执行当前的Vue实例,也就是tabs
组件自己,须要在外层设置一个_this=this
的局部变量来间接使用this
。
遍历每个pane
组件后,把它的label
和name
提取出来,构成一个Object
并添加到数据navList
数组里。
在使用v-for
指令循环显示tab
标题时,使用v-bind:class
指向了一个名为tabCls
的methods
来动态设置class
名称。
点击每一个tab
标题时,会触发handleChange
方法来改变当前选中tab
的索引,也就是pane
组件的name
。在watch
选项中监听了currentValue
,当其发生变化时,触发updateStatus
方法来更新pane
组件的显示状态。
使用组件嵌套的方式,将一系列pane
组件做为tabs
组件的slot
;tabs
组件和pane
组件通讯上,使用了$parent
和$children
的方法访问父链和子链;定义了prop:value
和data:currentValue
,使用$emit('input')
来实现v-model
的用法。
<p data-height="365" data-theme-id="0" data-slug-hash="vrXWQw" data-default-tab="html,result" data-user="whjin" data-embed-version="2" data-pen-title="Vue-tabs" class="codepen">See the Pen Vue-tabs by whjin (@whjin) on CodePen.</p>
<script async src="https://static.codepen.io/ass...;></script>