vue.js 的学习
vue的构造器使用
<div id="vue_det"> <h1>site : {{site}}</h1> <h2>site : {{details()}}</h1> </div> <script type="text/javascript"> var vm = new Vue({ el: '#vue_det', data: { site: "hello world!", }, methods: { details: function() { return this.site + " - 学的不仅是技术,更是梦想!"; } } }) </script>
|
构造器中 el用于与对应dom树的元素建立联系。(这种联系通常是相互之间影响的)
data用于定义属性
methods用于定义方法
{{}} 用于输出对象属性和函数返回值。
配合vue使用的dom元素属性
插值 v-html
用于向dom元素中插入html语句。html语句在data中赋值。
<div id="app"> <div v-html="message"></div> </div> <script> new Vue({ el: '#app', data: { message: '<h1>hello world!</h1>' } }) </script>
|
dom元素属性动态赋值 v-bind
v-bind:需要动态决定标签的属性的时候,可以使用到v-bind
语法糖的写法: “:标签属性”。
例如:动态绑定a标签的href属性,动态绑定img的src属性
在需要动态绑定的属性前面加上v-bind就会自动去vue实例里面去找当前的属性去进行设置.
<img id="app" v-bind:src="imageUrl"/> <img id="app":src="imageUrl"/> <script> new Vue({ el: '#app', data: { imageUrl: 'https://img-blog.csdnimg.cn/20200426130819754.png' } }) </script>
|
用于class动态绑定属性,当value值为true的时候才会添加到class里面。
当然对象式语法也可以用于style的动态绑定属性。
<h2 :class="{ key : true, key1 : false}"></h2>
<h2 id="app" class="class4" :class="{ 'class1' : true, 'class2' : T,'class3': isT() }">hello world!</h2>
<script> new Vue({ el: '#app', data: { T :false },methods: { isT : function(){ return true; } } }) </script>
|
用于style
<h2 style="font-size:50px">hello world</h2> <h2 :style="{'font-size':'50px'}">hello world</h2> <h2 id="app3" :style="{'font-size':T}">hello world</h2>
<script> new Vue({ el: '#app3', data: { T :'50px' } })
</script>
|
<h2 :class="['class1','class2']"></h2>
<h2 id="app" class="class4" :class="[c1,c2,getC()]">hello world!</h2>
<script> new Vue({ el: '#app', data: { c1:'class1', c2:'class2'
},methods: { getC : function(){ return ['class3','class5'] } } }) </script>
|
在style中使用
<div id="app"> <div v-bind:style="[baseStyles, overridingStyles]">hello world~</div> </div>
<script> new Vue({ el: '#app', data: { baseStyles: { color: 'green', fontSize: '30px' }, overridingStyles: { 'font-weight': 'bold' } } }) </script>
|
当然vue.js都提供了完全的 JavaScript 表达式支持。
<div id="app"> {{5+5}}<br> {{ ok ? 'YES' : 'NO' }}<br> {{ message.split('').reverse().join('') }} <div v-bind:id="'list-' + id">菜鸟教程</div> </div> <script> new Vue({ el: '#app', data: { ok: true, message: 'RUNOOB', id : 1 } }) </script>
|
是否创建元素 v-if v-else v-else-if
根据v-if中的表达式是否为true决定元素是否创建。
<div id="app"> <div id="A" v-if="type === 'A'"> A </div> <div id="B" v-else-if="type === 'B'"> B </div> <div id="C" v-else-if="type === 'C'"> C </div> <div v-else> Not A/B/C </div> </div> <script> new Vue({ el: '#app', data: { type: 'C' } }) </script>
|
决定是否display v-show
根据v-show表达式是否为true决定元素是否展示
<div id="app5" v-show="fg"> fg </div>
<script> new Vue({ el: '#app5', data: { fg:false } }) </script>
|
绑定数组渲染列表 v-for
<div id="app6"> <ol> <li v-for="item in sites"> {{ item }} {{ item.name }} </li> </ol>
</div> <script>
var v = new Vue({ el: '#app6', data: { sites: [ { name: 'Runoob' }, { name: 'Google' }, { name: 'Taobao' } ] } }) </script>
|
用来打印对象的每一个值
<div id="app"> <ul> <li v-for="value in object"> {{ value }} </li> </ul> </div> <script> new Vue({ el: '#app', data: { object: { a1:"a", a2:"b", a3:"c" } } }) </script>
|
当然对于每一项的匹配参数数量不同时,匹配的值也不相同。
v-for="(k,v) in object" # 打印对象每一个属性的 key和value
v-for="(k,v,i) in object " #打印得失 key和value和index
双向数据绑定 v-model
实现dom元素与JavaScript中对象的值的 双向更新。
<div id="app"> <p>input 元素:</p> <input v-model="message" placeholder="编辑我……"> <p>消息是: {{ message }}</p>
</div>
<script> new Vue({ el: '#app', data: { message: 'hello world' } }) </script>
|
<div id="app2"> <p>单个复选框:</p> <input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label>
<p>多个复选框:</p> <input type="checkbox" id="runoob" value="Runoob" v-model="checkedNames"> <label for="runoob">Runoob</label> <input type="checkbox" id="google" value="Google" v-model="checkedNames"> <label for="google">Google</label> <input type="checkbox" id="taobao" value="Taobao" v-model="checkedNames"> <label for="taobao">taobao</label> <br> <span>选择的值为: {{ checkedNames }}</span> </div>
<script> new Vue({ el: '#app2', data: { checked :'', checkedNames: [] } }) </script>
|
- 一个checkbox绑定一个属性,该属性记录CheckBox 的checkstate为true 或者 false
- 多个checkbox绑定同一个属性,该属性记录的是每一个checkbox的value值,组成一个数学组。
- 对于单选按钮 radio还是select 都是直接一项绑定一个属性,属性记录的是元素value
v-model的预处理修饰符:
- .lazy 让属性记录值得时间是 元素的"change" 而不是 “input” 事件中更新。
- .trim 记录的值处理收尾空格
- .number 对于记录的值转换为数值存储,不能够转换就记录原值。
### key管理可复用元素
在vue中为尽可能的高效率渲染元素,会复用已有的元素而不是重新渲染,比如。
<div id="app"> <template v-if="login"> <label>用户名:</label> <input placeholder="输入你的用户名"> </template> <template v-else> <label>email:</label> <input placeholder="输入你的email"> </template> <p> <button @click="changelogintype"> 切换登录方式 </button> </p> </div> <script> var vm = new Vue({ data:{ login:false },methods:{ changelogintype(){ if(this.login===false){ this.login=true; }else{ this.login=false; } } } }).amount("#app"); </script>
|
在input中输入内容,然后点击按钮后,切换登录方式。发现input中的内容没有改变,但是登录方式是改变的,主要原因是两个模板中使用了相同的input元素,Vue为了提高渲染效率,会复用input元素,只是更改placeholder中的内容。
实际开发中我们有时不希望这种情况发生,就引用 key属性,(key值唯一)
<template v-if="login"> <label>用户名:</label> <input placeholder="输入你的用户名" key="username-input"> </template> <template v-else> <label>email:</label> <input placeholder="输入你的email" key="email-input"> </template>
|