Vue手册 [TOC]
Vue实例 关联数据和DOM 1 2 3 4 <div id ="app" > {{ message }} </div >
1 2 3 4 5 6 var app = new Vue({ el : '#app' , data : { message : 'Hello Vue!' } })
渲染绑定元素 1 2 3 4 5 6 <div id ="app-2" > <span v-bind:title ="message" > 鼠标悬停几秒钟查看此处动态绑定的提示信息! </span > </div >
1 2 3 4 5 6 7 var app2 = new Vue({ el : '#app-2' , data : { message : '页面加载于 ' + new Date ().toLocaleString() } }
if条件 1 2 3 4 <div id ="app-3" > <p v-if ="seen" > 现在你看到我了</p > </div >
1 2 3 4 5 6 7 var app3 = new Vue({ el : '#app-3' , data : { seen : true } })
for循环 1 2 3 4 5 6 7 8 <div id ="app-4" > <ol > <li v-for ="todo in todos" > {{ todo.text }} </li > </ol > </div >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var app4 = new Vue({ el : '#app-4' , data : { todos : [{ text : '学习 JavaScript' }, { text : '学习 Vue' }, { text : '整个牛项目' } ] } })
v-on事件监听 1 2 3 4 5 <div id ="app-5" > <p > {{ message }}</p > <button v-on:click ="reverseMessage" > 反转消息</button > </div >
1 2 3 4 5 6 7 8 9 10 11 12 var app5 = new Vue({ el : '#app-5' , data : { message : 'Hello Vue.js!' }, methods : { reverseMessage : function ( ) { this .message = this .message.split('' ).reverse().join('' ) } } })
v-model双向绑定 1 2 3 4 5 <div id ="app-6" > <p > {{ message }}</p > <input v-model ="message" > </div >
1 2 3 4 5 6 7 var app6 = new Vue({ el : '#app-6' , data : { message : 'Hello Vue!' } })
freeze冻结 阻止修改 1 2 3 4 5 6 <div id ="app" > <p > {{ foo }}</p > <button v-on:click ="foo = 'baz'" > Change it</button > </div >
1 2 3 4 5 6 7 8 9 10 11 var obj = { foo : 'bar' } Object .freeze(obj)new Vue({ el : '#app' , data : obj })
vue生命周期 1 2 3 4 5 6 7 8 9 10 11 new Vue({ data : { a : 1 }, created : function ( ) { console .log('a is: ' + this .a) } })
模板语法 文本 1 2 3 <span v-once > 这个将不会改变: {{ msg }}</span >
原始 HTML 1 2 3 4 <p > Using mustaches: {{ rawHtml }}</p > <p > Using v-html directive: <span v-html ="rawHtml" > </span > </p >
Attribute 1 2 3 4 <div v-bind:id ="dynamicId" > </div > <button v-bind:disabled ="isButtonDisabled" > Button</button >
使用 JavaScript 表达式 1 2 3 4 5 6 7 8 9 {{ number + 1 }} {{ ok ? 'YES' : 'NO' }} {{ message.split('').reverse().join('') }} <div v-bind:id ="'list-' + id" > </div >
只能访问全局变量白名单,不能访问用户自定义全局变量
1 2 3 4 5 6 7 if (process.env.NODE_ENV !== 'production' ) { const allowedGlobals = makeMap( 'Infinity,undefined,NaN,isFinite,isNaN,' 'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' 'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' 'require' )
参数 1 2 3 4 5 <a v-bind:href ="url" > ...</a > <a v-on:click ="doSomething" > ...</a >
动态参数 1 2 3 4 5 <a v-bind: [attributeName ]="url" > ... </a > <a v-on: [eventName ]="doSomething" > ... </a >
修饰符 1 2 3 <form v-on:submit.prevent ="onSubmit" > ...</form >
计算属性和侦听器 computed 计算 计算属性具有缓存, 用于获取返回值
1 2 3 4 5 6 <div id ="example" > <p > Original message: "{{ message }}"</p > <input v-model ="message" > <p > Computed reversed message: "{{ reversedMessage }}"</p > </div >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var vm = new Vue({ el : '#example' , data : { message : 'Hello' }, computed : { reversedMessage : function ( ) { return this .message.split('' ).reverse().join('' ) } } })
watch 侦听 监听特定值得前后变化, 用于执行
1 2 3 4 5 6 7 8 watch : { status : function (value, oldValue ) { this .status = value this .page = 1 this .getData(1 ) }, },
Class 与 Style 绑定 class对象语法 1 2 <div class ="static" v-bind:class ="{ active: isActive, 'text-danger': hasError }" > </div >
1 2 3 4 5 data : { isActive : true , hasError : false }
style内联样式 1 2 3 <div v-bind:style ="styleObject" > </div > <div v-bind:style ="[baseStyles, overridingStyles]" > </div >
1 2 3 4 5 6 data: { styleObject : { color : 'red' , fontSize : '13px' } }
条件渲染 v-if v-else-if
1 2 3 4 5 6 7 8 9 10 11 12 13 <div v-if ="type === 'A'" > A </div > <div v-else-if ="type === 'B'" > B </div > <div v-else-if ="type === 'C'" > C </div > <div v-else > Not A/B/C </div >
独立,不复用
1 2 3 4 5 6 7 8 9 10 <template v-if ="loginType === 'username'" > <label > Username</label > <input placeholder ="Enter your username" key ="username-input" > </template > <template v-else > <label > Email</label > <input placeholder ="Enter your email address" key ="email-input" > </template >
v-for 数组
1 2 3 4 5 6 <ul id ="example-2" > <li v-for ="(item, index) in items" > {{ parentMessage }} - {{ index }} - {{ item.message }} </li > </ul >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var example2 = new Vue({ el : '#example-2' , data : { parentMessage : 'Parent' , items : [{ message : 'Foo' }, { message : 'Bar' } ] } })
对象
1 2 3 4 5 6 <ul id ="v-for-object" class ="demo" > <li v-for ="(value, name,index) in object" > {{index}}.{{ name }}: {{ value }} </li > </ul >
1 2 3 4 5 6 7 8 9 10 11 new Vue({ el : '#v-for-object' , data : { object : { title : 'How to do lists in Vue' , author : 'Jane Doe' , publishedAt : '2016-04-10' } } })
数组更新检测 变异方法
push()向数组的末尾添加一个或多个元素,并返回新的长度 pop()删除并返回数组的最后一个元素。 shift()把数组的第一个元素从其中删除,并返回第一个元素的值 unshift()向数组的开头添加一个或更多元素,并返回新的长度。 splice()向/从数组中添加/删除项目,然后返回被删除的项目 sort()对数组的元素进行排序。 reverse()颠倒数组中元素的顺序。 替换数组
filter() 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。 concat() 用于连接两个或多个数组。 slice() 可从已有的数组中返回选定的元素。 事件处理 监听事件 v-on 监听DOM事件,运行js代码
1 2 3 4 5 <div id ="example-1" > <button v-on:click ="counter += 1" > Add 1</button > <p > The button above has been clicked {{ counter }} times.</p > </div >
1 2 3 4 5 6 7 var example1 = new Vue({ el : '#example-1' , data : { counter : 0 } })
事件处理方法 1 2 3 4 5 <div id ="example-3" > <button v-on:click ="say('hi')" > Say hi</button > <button v-on:click ="say('what')" > Say what</button > </div >
1 2 3 4 5 6 7 8 new Vue({ el : '#example-3' , methods : { say : function (message ) { alert(message) } } })
事件修饰符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <a v-on:click.stop ="doThis" > </a > <form v-on:submit.prevent ="onSubmit" > </form > <a v-on:click.stop.prevent ="doThat" > </a > <form v-on:submit.prevent > </form > <div v-on:click.capture ="doThis" > ...</div > <div v-on:click.self ="doThat" > ...</div > <a v-on:click.once ="doThis" > </a > <div v-on:scroll.passive ="onScroll" > ...</div >
按键修饰符 1 2 3 <input v-on:keyup.enter ="submit" >
表单输入绑定 文本 1 2 3 4 5 <span > Multiline message is:</span > <p style ="white-space: pre-line;" > {{ message }}</p > <br > <textarea v-model ="message" placeholder ="add multiple lines" > </textarea >
复选框 1 2 3 4 5 6 7 8 9 10 11 <div id ='example-3' > <input type ="checkbox" value ="Jack" v-model ="checkedNames" > <label for ="jack" > Jack</label > <input type ="checkbox" value ="John" v-model ="checkedNames" > <label for ="john" > John</label > <input type ="checkbox" value ="Mike" v-model ="checkedNames" > <label for ="mike" > Mike</label > <br > <span > Checked names: {{ checkedNames }}</span > </div >
1 2 3 4 5 6 7 new Vue({ el : '#example-3' , data : { checkedNames : [] } })
单选按钮 1 2 3 4 5 6 7 8 9 10 <div id ="example-4" > <input type ="radio" value ="One" v-model ="picked" > <label for ="one" > One</label > <br > <input type ="radio" value ="Two" v-model ="picked" > <label for ="two" > Two</label > <br > <span > Picked: {{ picked }}</span > </div >
1 2 3 4 5 6 7 new Vue({ el : '#example-4' , data : { picked : '' } })
选择框 单选
1 2 3 4 5 6 7 8 <select v-model ="selected" > <option v-for ="option in options" v-bind:value ="option.value" > {{ option.text }} </option > </select > <span > Selected: {{ selected }}</span >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 new Vue({ el : '...' , data : { selected : 'A' , options : [{ text : 'One' , value : 'A' }, { text : 'Two' , value : 'B' }, { text : 'Three' , value : 'C' } ] } })
修饰符 .lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步:
1 2 3 <input v-model.lazy ="msg" >
.number 如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符: 这通常很有用,因为即使在 type=”number” 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。
1 2 <input v-model.number ="age" type ="number" >
.trim 如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:
1 2 <input v-model.trim ="msg" >
组件注册 通过 Vue.component 全局注册,名称使用 kebab-case样式一个组件的 data 选项必须是一个函数 ,因此每个实例可以维护一份被返回对象的独立的拷贝
1 2 3 4 5 6 <div id ="components-demo" > <button-counter > </button-counter > <button-counter > </button-counter > <button-counter > </button-counter > </div >
1 2 3 4 5 6 7 8 9 10 Vue.component('button-counter' , { data : function ( ) { return { count : 0 } }, template : '<button v-on:click="count++">You clicked me {{ count }} times.</button>' })
传递数据到子组件 1 2 3 4 5 6 <blog-post post-title ="My journey with Vue" > </blog-post > <blog-post post-title ="Blogging with Vue" > </blog-post > <blog-post post-title ="Why Vue is so fun" > </blog-post > <blog-post v-for ="post in posts" v-bind:key ="post.id" v-bind:title ="post.title" v-bind:content ="post.content" v-bind:publishedAt ="post.publishedAt" v-bind:comments ="post.comments" > </blog-post >
1 2 3 4 5 Vue.component('blog-post' , { props : ['post-title' ], template : '<h3>{{ title }}</h3>' })
动态组件 在不同组件之间进行动态切换
1 2 3 <component v-bind:is ="currentTabComponent" > </component >
特殊渲染
1 2 3 4 5 <table > <tr is ="blog-post-row" > </tr > </table >
局部注册 外部构建后 导入
1 2 3 4 5 6 7 8 9 10 11 12 import BaseButton from './BaseButton.vue' import BaseIcon from './BaseIcon.vue' import BaseInput from './BaseInput.vue' export default { components : { "base-button" : BaseButton, "base-icon" : BaseIcon, "base-input" : BaseInput } }
Prop 传递静态或动态 Prop 1 2 3 4 5 6 7 8 9 <blog-post v-bind:title ="post.title" > </blog-post > <blog-post v-bind:title ="post.title + ' by ' + post.author.name" > </blog-post >
Prop 验证 控制台的警告, 方便他人调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 Vue.component('my-component' , { props : { propA : Number , propB : [String , Number ], propC : { type : String , required : true }, propD : { type : Number , default : 100 }, propE : { type : Object , default : function ( ) { return { message : 'hello' } } }, propF : { validator : function (value ) { return ['success' , 'warning' , 'danger' ].indexOf(value) !== -1 } } } })
type 类型
String Number Boolean Array Object Date Function Symbol 过滤器 常用于文本预处理
1 2 3 4 5 6 7 8 9 10 11 12 {{ message | capitalize }} <div v-bind:id ="rawId | formatId" > </div > {{ message | filterA | filterB }} {{ message | filterA('arg1', arg2) }}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 filters : { capitalize : function (value ) { if (!value) return '' value = value.toString() return value.charAt(0 ).toUpperCase() + value.slice(1 ) } } Vue.filter('capitalize' , function (value ) { if (!value) return '' value = value.toString() return value.charAt(0 ).toUpperCase() + value.slice(1 ) }) new Vue({ })