想必喜欢前端开发的小伙伴们都或多或少接触过MVVM这个概念,说起MVVM,第一时间想到的便是angularjs,knockoutjs等已经被广泛运用的MVVM框架,之前我也没有在这方面有很多了解,最近在做项目的过程中接触了Vue.js,这是一个小巧精致,性能优异的MVVM框架,可以说对初学者是比较容易入门的,该框架的英文文档写得很好,但是中文版访问还不太稳定,翻译也有待改进,所以自己一遍学习,一遍记录自己的思考,与各位共享学习的经验。
第一篇主要是想谈谈vue.js中的Directives即指令,在vue.js中指令就是一个通知库进行某些具体的dom操作的口令,在html中表现为如下形式:
<element prefix-directiveId="[argument:] expression [| filters...]"> </element>
Directives分为1.Reactive Directives、2.Literal Directives、3.Empty Directives,下面结合具体的api阐述他们的作用:
1.Reactive Directives(响应式指令)
Reactive Directives可以绑定在Vue实例或者在Vue实例上下文中求值的表达式上,当绑定的对象发生改变时,指令中的update()会在下一个系统单位时间发生异步响应,我们来看看具体的用法:
v-text:更新元素的textContent,事实上在html中{{mustache}}形式的插入值也会被编译为针对一个textNode的v-text指令。
v-html:更新元素的innerHTML,由于可能插入恶意代码,使用时要注意保证来源安全。
v-show:根据绑定值的true或false来决定所在元素在网页中正常显示还是显示为空。
v-class:这个指令有一个可选参数,无参数时将绑定值(一般为class名)添加到所在元素的classlist当中,并且一旦检测绑定值有改动,便随之改变classlist里对应的class;提供参数时参数的true或false将决定绑定值(class)是否被添加到所在元素的classlist中,示例如下:
<span v-class=" red : hasError, bold : isImportant, hidden : isHidden "></span>
v-attr:更新所在元素的某些属性(由参数表示)。
<canvas v-attr="width:w, height:h"></canvas>
v-style:更新所在元素的样式,会智能添加浏览器供应商前缀,方便我们书写样式。这个指令有一个可选参数,无参数时,若绑定值为String则将绑定值设置为元素的style.cssText,若绑定值为Object则将Object中的样式键值对放入元素的style object当中;
<div v-style="myStyles"></div>
// myStyles can either be a String:
"color:red; font-weight:bold;"
// or an Object:
{
color: 'red',
// both camelCase and dash-case works
fontWeight: 'bold',
'font-size': '2em'
}
提供参数时,参数指明了css属性的对应值:
<div v-style=" top: top + 'px', left: left + 'px', background-color: 'rgb(0,0,' + bg + ')' "></div>
v-on:为元素添加并更新事件监听器,参数可以是一个处理函数或者一个函数语句。
<div id="demo"> <a v-on="click: onClick">Trigger a handler</a> <a v-on="click: n++">Trigger an expression</a> </div>
我们可以为处理函数提供参数,其中this指的是当前的ViewModel,如下例中通过传入this参数改变元素的text值:
<ul id="list">
<li v-repeat="items" v-on="click: toggle(this)">{{text}}</li>
</ul>
new Vue({
el: '#list',
data: {
items: [
{ text: 'one', done: true },
{ text: 'two', done: false }
]
},
methods: {
toggle: function (item) {
item.done = !item.done
}
}
})
我们还可以传入$event表示触发处理函数的DOM事件,如下例传入$event阻止事件冒泡:
<button v-on="click: submit('hello!', $event)">Submit</button>
/* ... */
{
methods: {
submit: function (msg, e) {
e.stopPropagation()
}
}
}
/* ... */
在监听键盘事件时由于要判断按键值,可以结合filter写成如下两种形式:
<!-- only call vm.submit() when the keyCode is 13 --> <input v-on="keyup:submit | key 13"> <!-- same as above --> <input v-on="keyup:submit | key enter">
当ViewModel销毁时,v-on绑定的事件会自动消除,我们不必亲自去清理这些绑定事件,这也防止了内存的泄露。
v-model:为表单元素创建一个双向绑定,详细介绍请看这里
v-if:根据绑定值的true或false来插入或移除元素,如例子中我们将根据test的正确与否决定两个<p>元素是否插入<template>当中
<template v-if="test"> <p>hello</p> <p>world</p> </template>
v-repeat:为绑定数组或对象中的每一个item创建一个子ViewModel,或者为绑定的数字值创建对应数量的子ViewModel。并根据绑定值的改变随时更新。没有提供参数时子ViewModel会直接使用绑定数组中的分配单元作为它的$data,如果值不是一个对象,则会创建一个数据包装对象,而值会被设置在别名为$value的 key 上。
<ul>
<li v-repeat="users">
{{name}} {{email}}
</li>
</ul>
如果提供了参数,我们将创建一个数据包装对象,将参数作为对象的key,从而访问对象模板中的属性:
<ul>
<li v-repeat="user : users">
{{user.name}} {{user.email}}
</li>
</ul>
v-with:这个指令只能结合接下来讲到的v-component指令使用,作用是让子ViewModel可以继承父ViewModel的数据,我们可以传入父ViewModel的属性对象或单个属性,在子ViewModel中访问:
// parent data looks like this
{
user: {
name: 'Foo Bar',
email: 'foo@bar.com'
}
}
继承对象:
<my-component v-with="user">
<!-- you can access properties without `user.` -->
{{name}} {{email}}
</my-component>
继承单个属性:
<my-component v-with="myName: user.name, myEmail: user.email">
<!-- you can access properties with the new keys -->
{{myName}} {{myEmail}}
</my-component>
v-events:这个指令也只能结合接下来讲到的v-component指令使用,它使得父ViewModel能够监听子ViewModel上的事件,我们要注意区分v-on与v-events,v-events监听的是通过vm.$emit()创建的 Vue 组件系统事件,而不是 DOM 事件。我们举例说明:
<!-- inside parent template --> <div v-component="child" v-events="change: onChildChange"></div>
当子ViewModel调用this.$emit('change', …)时会触发父ViewModel的onChildChange()方法,并且把emit函数中附加的参数传给onChildChange()方法。
2.Literal Directives(字面指令)
字面指令并没有绑定到某一个对象上,字面指令是把它们的参数作为纯字符串传给bind()函数中执行一次,字面指令可以接受{{mustache}}表达式,但是该表达式只会在编译阶段执行一次,不会绑定数据的改变:
下面看一看具体的api:
v-component:之前提到过,这是使用我们提前声明并注册好的组件构造器将当前元素编译为子ViewModel,从而实现数据继承,之后的文章会详细介绍组件系统。
v-ref:在父ViewModel中创建子ViewModel的引用,方便父ViewModel中的$对象访问子组件:
<div id="parent"> <div v-component="user-profile" v-ref="profile"></div> </div>
var parent = new Vue({ el: '#parent' })
// 访问子组件
var child = parent.$.profile
这个指令只能与v-component和v-repeat一起使用,与v-repeat一起使用时,其value是与绑定数据数组对应的子组件数组。
v-el:为当前dom元素创建一个引用,供其自身vue实例使用,例如<div v-el="hi">可以使得vm.$$.hi访问到该dom元素
v-partial:将当前dom元素中的innerHTML替换为事先注册的partial,有两种写法,{{ mustache}}可以让dom元素随数据改变而更新:
<!-- content will change based on vm.partialId -->
<div v-partial="{{partialId}}"></div>
另一种写法则没有数据跟随更新的效果:
<div>{{> my-partial}}</div>
v-transition:为当前dom元素在指定参数值作用时添加动画效果,后续文章会详细介绍
3.Empty Directives(字面指令)
v-pre:这个指令是通知编译器跳过当前dom元素和其所有子元素,这是为了在我们编程过程中对无需编译的元素节省编译时间
v-cloak:在当前元素编译完成之前改指令都会存在,我们一般使用这个指令来在元素编译未完成时隐藏原始的 {{ Mustache }} 模板,可以在css中这样写:
[v-cloak] { display: none }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# vue.js
# Directives
# 指令
# vue 自定义指令directives及其常用钩子函数说明
# vue filters和directives访问this的问题详解
# vue通过指令(directives)实现点击空白处收起下拉框
# vue.js自定义组件directives的实例代码
# 详解vue + vuex + directives实现权限按钮的思路
# vue3的自定义指令directives实现
# 绑定
# 定值
# 创建一个
# 详细介绍
# 这是
# 一遍
# 我们可以
# 可选
# 讲到
# 值为
# 则将
# 有一个
# 自己的
# 的是
# 译为
# 是一个
# 我也
# 他们的
# 很好
# 也会
相关文章:
如何在Windows 2008云服务器安全搭建网站?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
购物网站制作公司有哪些,哪个购物网站比较好?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何在腾讯云服务器上快速搭建个人网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
宝塔建站助手安装配置与建站模板使用全流程解析
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
网站代码制作软件有哪些,如何生成自己网站的代码?
Swift中swift中的switch 语句
活动邀请函制作网站有哪些,活动邀请函文案?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
如何在Windows虚拟主机上快速搭建网站?
如何通过建站之星自助学习解决操作问题?
青浦网站制作公司有哪些,苹果官网发货地是哪里?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
营销式网站制作方案,销售哪个网站招聘效果最好?
如何通过商城自助建站源码实现零基础高效建站?
Swift中循环语句中的转移语句 break 和 continue
公司门户网站制作流程,华为官网怎么做?
网站制作壁纸教程视频,电脑壁纸网站?
建站ABC备案流程中有哪些关键注意事项?
宿州网站制作公司兴策,安徽省低保查询网站?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
常州企业网站制作公司,全国继续教育网怎么登录?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
香港服务器租用费用高吗?如何避免常见误区?
如何快速生成橙子建站落地页链接?
seo网站制作优化,网站SEO优化步骤有哪些?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
建站上市公司网站建设方案与SEO优化服务定制指南
PHP正则匹配日期和时间(时间戳转换)的实例代码
网站制作公司,橙子建站是合法的吗?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
,有什么在线背英语单词效率比较高的网站?
网站企业制作流程,用什么语言做企业网站比较好?
如何在宝塔面板中修改默认建站目录?
如何高效利用200m空间完成建站?
家庭服务器如何搭建个人网站?
如何在腾讯云服务器快速搭建个人网站?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
建站之星代理如何优化在线客服效率?
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何在服务器上配置二级域名建站?
定制建站流程步骤详解:一站式方案设计与开发指南
网站按钮制作软件,如何实现网页中按钮的自动点击?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
*请认真填写需求信息,我们会在24小时内与您取得联系。