若是想显示{{}}标签,而不进行替换 使用 v-pre便可跳 过这个元素和 它的子元素的 编译过程,
例如:javascript
<span v-pre >{{这里的内容是不会被编译的门}}</ span>
<div id=” app” > { { date | formatDate ) ) </div> var app =new Vue({ el : ’ #app ’ , data: { date : new Date() filters : { formatDate : function (value) { //这里的 value 就是须要过滤的数据 } })
过滤器也能够串联,并且能够接收参数,例如:css
<! 一串联一〉 { { message | filterA | filterB } } 〈!一接收参数一一〉 {{ message | flterA ('argl ’,’ arg2 ’)}}
这里的字符argl arg2 将分别传给过滤器的第 2个和第 3个参数,由于第1 个是数据自己。html
**过滤器应当用于处理简单的文本转换,若是要实现更为复杂的数据变换,应该使用计
算属性;**vue
既然使用 methods 就能够实现,那么为何还须要计算属性呢?缘由就是
计算属性是基于它的依赖缓存的。 一个计算属性所依赖的数据发生变化时,它才会从新取值,因此
text 只要不改变,计算属性也就不更新java
<div :class=”{’ active ’: isActive }”></div> <div : class=” [isActive ? activeCls :'', errorCls] ” ></div> <div :style ={’ color ’: color, ’ fontSize ’ : fontSize +’ px ’}”〉文本</ div>
[v-cloak] { display: none; } <div id=” app ” v-cloak> {{message )) </div>
通常状况下,v-cloak是一 个解决初始化慢致使页面闪动的最佳实践,对于简单的项目很实
用,可是在具备工程化的项目里,好比后面进阶篇将介绍 webpack和 vue-router 时,项目的 HTML
结构只有一 个空的 div 元素,剩余的内容都是由路由去挂载不一样组件完成的,因此再也不须要 v-cloak。webpack
可使用 Vue提供的 key 属性,它可让你本身决定是否要复用元
素, key 的值必须是惟 一的:web
<div id=” app”> <template v-if=”type ===’ name ’”> <label >用户名 </ label> <input placeholder=”输入用户名” key=" name-input”> </template> <template v-else> <label >邮箱 </ label> <input placeholder=”输入邮箱” key=呗ail-input ”〉 </template> <button @click=” handleToggleClick ”〉切换输入类型</button> </div>
给两个<input>元素都增长 key后 就不会复用了,切换类型时键入的内容也会被删除,不过
<label>元素仍然是被复用的,由于没有添加 key 属性。vue-router
Vue 包含了一 组观察数组变异的方法,使用它们改变数组也会触
发视图更新:数组
须要注意的是,如下变更的数组中, Vue 是不能检测到的,也不会触发视图更新:浏览器
解决第一 个问题能够用两种方法实现一样的效果,第 种是使用 Vue 内置的 set 方法:
Vue .set(app.books, 3 , { name: 《css 揭秘》 ’, author :’[希] Lea Verou ’ }
若是是在 webpack 中使用组件化的方式(进阶篇中将介绍〉,默认是没有导入 Vue 的,这时
可使用$set ,例如:
this.$set(app.books, 3 , { name: ’《css 揭秘》’, author :’[希] Lea Verou ’ })
第二个问题也能够直接用 splice 来解决:
app.books.splice(l);
在methods中 定义了咱们 须要的方法供@click 调用, 须要注意 ,@click 调用的方法名后能够不跟括号“()” 此时,若是该方法有参数,默认会将原生事件对象 event 传入,能够尝试修改成@click=”handleAdd”,而后在 handleAdd 内打印出 count 参数看看。在大部分业务场景中,若是方法不须要传入参数,为了简即可以不写括号。
Vue 提供了 个特殊变量$event ,用于访问原生 DOM 事件,例以下面的实例能够阻止连接打开:
<div id=” app ” > <a href=”http:llwww.apple.com”@click="handleClick ('禁止打开’,$event )”>打开连接 </a> </div> <script> var app =new Vue({ el :’#app ’, methods: { handleClick : function (message, event) { event . preventDefault() ; window . alert(message); } } })
例如:
<! -- Shift + S --> <input @keyup.shift . 83=”handleSave ”> <!-- Ctrl + Click --> <div @click.ctrl=”doSomething”>Do something</div>
组件与之相似,须要注册后才可使用。注册有全局注册和局部注册两种方式。全局注册后,
任何 Vue 实例均可以使用。全局注册示例代码以下
Vue.component (’ my- component ’, { //选项 })
Vue组件的模板在某些状况下会受到 HTML 的限制,好比<table>内规定只容许是〈tr〉<td>、<
th>等这些表格元素,因此在<tabl >内直接使用组件是无效的 这种状况下,可使用特殊的**is
属性**来挂载组件 示例代码以下
<div id=” app” > <table> <tbody is=”my-component” ></tbody> </ table> </div>
<script> Vue.component ( ’ my-component ’, { template :’ div >这里是组件的内容</ div> }) ; var app =new Vue({ el : ’ #app ’ }) <script />
tbody 在渲染时 会被替换为组件的内容。常见的限制元素还有<ul>、<ol>、<select>
JavaScript 对象是引用关系,因此若是 return出的对象引用了外部对象, 那这个对象就
是共享的,任何 方修改都会同步。好比下面的示例:
<div id=” app” > <my- component></my-component> <my-component></my-component> <my-component></my-component> </div> <script> var data = { counter : 0 } Vue.component (’ my- component ’, { template :’<button @click=” counter++” >{{ counter ) )</button>’, data:function () { return data ; } }) var app =new Vue ( { el :’#app ’ }) </script>
组件使用了3次 可是点击任意一 <button>。3 个数字都会加1 ,那是 由于组件 data
用的是外部 的对象,这确定不是咱们指望的效果,因此 给组件返回一个新的 data对 象来独立
例代码以下
<div id=” app” > <my- component></my-component> <my-component></my-component> <my-component></my-component> </div> <script> Vue.component (’ my- component ’, { template :’<button @click=” counter++” >{{ counter ) )</button>’, data:function () { return { counter:0 } } }) var app =new Vue ( { el :’#app ’ }) </script>
这样,点击3 个按钮就互不影响了,彻底达到复用的目的。
**注意,若是你要直接传递数字、布尔值、数组、对象,并且不使用 v-bind
,传递的仅
仅是字符串,尝试下面的示例来对比:**
<div id=” app ” > <my-component message=” [ 1 , 2, 3 ] ” ></my-component> <my-component :message=” [ 1 , 2, 3 ] ” ></my-component> </div> <script> Vue.component (’ my-component ’, { props: [ ’ message ’ ], template :’<div>{{ message.length }}</div>’ } ) var app =new Vue ( { el : ’ #app ’ }) </script>
同一个组件使用了两次,区别仅仅是第二个使用的是 v-bind
,渲染后的结果,第一个是7
,第二个才是数组的长度 3,
Vue.component my-component ’, props : { //必须是数字类型 propA : Number, //必须是字符串或数字类型 propB : [String, Number] , //布尔值,若是没有定义,默认值就是 true propC: { type : Boolean , default : true //数字,并且是必传 } propD: { type: Number , required : true //若是是数组或对象,默认值必须是一个函数来返回 } propE: { type : Array , default : function () { return [] ; //自定义 个验证函数 } } propF: { validator : function (value) { return value > 10; } } } )};
type 类型能够是:
type也能够是一 个自定义构造器,使用 instanceof 检测。
当prop 验证失败时,在开发版本下会在控制台抛出一 条警告。
子组件用 $emit()
来触发事件,父组件用$on()
来
监昕子组件的事件
推荐使用一个空的 Vue 实例做为中央事件总线( bus ),也就是一个中介
var bus= new Vue (); methods : { handleEvent: function () { bus.$emit(’on-message',' 来自组件 mponent-a 的内容') } } //在实例初始化时,监听来自 bus 实例的事件 bus.$on (’on-message ’, function (msg) { ...})
$refs 只是在组件 渲染完成后才填充,而且它是非响应式的 它仅仅做为一个直接访问子
苦? 组件的应急方案,应当避免在模板或计算属性中使用$refs
<div id=” app” > <div id div v-if=气howDiv 〉这是一段文本</ div> <button @click= getText 〉获取 div 内容</button> </div> <script> var app =new Vue({ el :’#app ’, data: { showDiv: false }, methods : { getText: function () { this.showDiv = true; var text = document .getElementByid (’ div ’) .innerHTML; console . log(text) ; } } }) </script>
这段代码并不难理解,可是运行后在控制台会抛出一个错误: Cannot read prope町’innerHU.伍’
of null ,意思就是获取不到 div 元素。这里就涉及 Vue 一个重要的概念:异步更新队列。
Vue 会根据当前浏览器环境优先使用原生的 Promise.then MutationObserver ,若是都不支持,
就会采用 setTimeout代替。
<div id=” app” > <div id div v-if=气howDiv 〉这是一段文本</ div> <button @click= getText 〉获取 div 内容</button> </div> <script> var app =new Vue({ el :’#app ’, data: { showDiv: false }, methods : { getText: function () { this.showDiv = true ; this.$nextTick (function () { var text = document . getElementByid ( ’ div ’) . innerHTML; console.log(text) ; } } }) </script>
这时再点击按钮,控制台就打印出 div 的内容“这是一段文本”了。
咱们应该不用去主动操做 DOM,由于 Vue 的核心思想就是数据驱动 DOM,但在很
多业务里,咱们避免不了会使用 些第三方库,好比 popper.js、 swiper等 ,这些基于原生 JavaScript 库都有建立和更新及销毁的完整生命周期,与 Vue 合使用时,就要利用好$nextTick
咱们如今所建立的实例都是经过 new Vue()的形式建立出来的 。在一些很是特殊的状况下,我
们须要动态地去建立 Vue 实例, Vue 提供了 Vue.extend和 $mount 两个方法来手动挂载一个实例。
Vue.extend是 基础 Vue 构造器,建立一个“子类”,参数是一 个包含组件选项的对象。
若是 Vue 实例在实例化时没有收到 el 选项,它就处于“未挂载”状态,没有关联的 DOM元
素。可使用$mount()手动地挂载一 个未挂载的实例。这个方法返回实例自身,于是能够链式调用
其余实例方法。示例代码以下:
<div id=” unt-div ”〉 </div> <script> var MyComponent =Vue.extend (( template :’<div>Hello: {{ ne } }</div>’, data: function () { return ( name :’Aresn ’ ., } ) new MyComponent ().$mount (’#mount-div ’);
另一种挂载方式
new MyComponent ({ el :’#mount-div ’ });
//或者,在文档以外渲染而且随后挂载
var component= new MyComponent() . $mount (); document.getElementByid ('mount-d ’) .appendChild(component.$el);
手动挂载实例(组件)是一 种比较极端的高级用法,在业务中几乎用不到,只在开发一 些复
杂的独立组件时可能会使用,因此只作了解就好。
//全局注册 Vue.directive(’focus ’,{ //指令选项 ., } ) //局部注册 var app =new Vue({ el :’#app ’, directive: { focus: { //指令选项 })
自定义指令的选项是由几个钩子函数组成的,每一个都是可选的。
时执行一次的初始化动做.
的绑定值,能够忽略没必要要的模板更新。