列表渲染指令v-for
基本用法
v-for一定是写在要遍历的元素上,v-for后接等号,类似于item in items(相当于 for 循环遍历)
遍历多个对象一定是遍历的数组
遍历完,一定要用模板渲染,才能显示
<!-- template -->
<div id="app">
<ul>
<li v-for="item in items">
{{item}}
</li>
</ul>
</div>
<!-- js -->
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
items:[1,2,3,4,5]
}
})
</script>
对象遍历
遍历多个对象+索引
第一个item ,第二个 index 索引
<ul>
<li v-for="(item, index) in items">
{{item}}
{{index}}
</li>
</ul>
<!-- js -->
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
items: [
{1:1},
{2:2},
{3:3},
{4:4},
]
},
})
</script>
遍历一个对象的多个属性
参数: 第一个为值,第二个为键名,第三个为索引
<!-- template -->
<div id="app">
<ul>
<li v-for="(value,key,index) in items">
{{value}}
{{key}}
{{index}}
</li>
</ul>
</div>
<!-- js -->
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
items: {
1:1,
2:2,
3:3,
4:4,
}
},
})
</script>
条件渲染指令
基本用法
v-if后接的是等号:等号后的内容必须是布尔值
v-if的实例用法弊端:
Vue 在渲染元素时 ,出于效率考虑,会尽可能地复用已有的元素而非重新渲染
对不想让其复用的标签或者元素,加入key即可
v-if,v-else
<div v-if="type==='name'">
用户名 :<input type="text" placeholder="请输入用户名" key="name">
</div>
<div v-else>
密码 :<input type="text" placeholder="请输入密码" key="psd">
</div>
<button v-on:click="toggleType">点我切换</button>
<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
},
methods:{
toggleType:function () {
//三目运算符
this.type = (this.type==='name' ?'password' : 'name')
}
}
})
</script>
v-else-if
<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>
v-show
<p v-show="9>a">我被渲染</p>
v-if和v-show的比较
- v-if:在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建,
开销较高,在运行时条件很少改变时使用。
应用在要实时改变页面,股票,天气走势图
- v-show:永远存在于页面中,只是调整css dispaly属性 none/block,开销较小。
v-text | v-html
模板取值{{ }},有个弊端:当网速很慢或者 JavaScript 出错的时候
会在页面显示{{xxx}}此时就可以用 v-text 解决这个问题
<div>{{LGD}}</div>
<!-- 上面和下面是一样的 -->
<div v-text="LGD"></div>
v-html输出 html 代码
<p v-html="message"></p>
v-on
<!-- template -->
<div id="app">
点击次数: {{count}}
<button v-on:click="handle()">点击我每次加1</button>
//@click 是语法糖
<button @click="handle(8)">点击我每次加8<button>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script>
var app = new Vue({
el:"#app",
data:{
count: 0
},
methods:{
handle(count) {
count = count || 1;
this.count += count;
}
}
})
</script>
v-model
以下model 都需要在 data 中声明初始值
data:{
count:1,
status: [],
sex: 男,
selected: ''
}
input
<input type="text" v-model="message">
textarea
<textarea cols="30" rows="10" v-model="message"></textarea>
checkbox
<input type="checkbox" id="first" value="1" v-model="status">
<label for="first">有效</label>
<input type="checkbox" id="second" value="2" v-model="status">
<label for="second">无效</label>
<div>状态:{{status}}</div>
radio
<input type="radio" id="one" value="男" v-model="sex">
<label for="one">男</label>
<input type="radio" id="two" value="女" v-model="sex">
<label for="one">女</label>
<div>性别:{{sex}}</div>
select
<select v-model="selected">
<option disabled value="">请选择</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<div>Selected: {{ selected }}</div>
v-pre
在模板中跳过vue的编译,直接输出原始值,
如果在标签中加入v-pre就不会输出vue中的data值了<div v-pre>{{message}}</div>
v-cloak
解决初始化慢导致页面闪动的最佳实践
在vue渲染完指定的整个DOM后才进行显示。
一般与display:none 结合使用 ```html // css [v-cloak] { display: none; }
// html
{{message}}
<a name="Qqj4f"></a>
## v-once
定义它的元素和组件只渲染一次
```html
<div v-once>第一次绑定的值:{{message}}</div>