zoukankan      html  css  js  c++  java
  • Vue(三)-- class与style绑定、条件渲染、列表渲染、列表的搜索和排序

    1.class与style绑定

    • 理解
      在应用界面中,某个(些)元素的样式是变化的
      class/style绑定就是专门用来实现动态样式效果的技术

    --1.1class绑定,:class='xxx'

    • xxx是字符串
      <p :class="a">Hello World</p>
    • xxx是对象
    <p :class="{aClass:isA , bClass:isB}">Hello World</p>
    isA和isB是布尔值
    
    • xxx是数组
      <p :class="['aClass','cClass']">Hello World</p>
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    		<style type="text/css">
    			.aClass {
    				color: red;
    			}
    
    			.bClass {
    				color: blue;
    			}
    		</style>
    	</head>
    	<body>
    		<div id="demo">
    			<h2></h2>
    			<p :class="a">Hello World</p>
    			<h2></h2>
    			<button @click="update">btn</button>
    		</div>
    		<script type="text/javascript">
    			var app = new Vue( {
    				el: '#demo',
    				data: {
    					a: 'aClass'
    				},
    				methods: {
    					update() {
    						this.a = 'bClass'
    					}
    				}
    			})
    		</script>
    	</body>
    </html>
    

    --1.2style绑定

    :style="{color:activeColor,fontSize:fontSize+'px'}"
    其中的activeColor/fontSize是data属性,可以改变

    2.条件渲染

    --2.1v-if和v-else

    <p v-if="ok">成功了</p>
    <p v-else="true">失败</p>
    

    --2.2v-show

    <p v-show="ok">表白成功</p>
    <p v-show="!ok">表白失败</p>
    

    --2.3比较v-if与v-show

    • v-if通过删除和增加标签来进行切换,v-show通过dispaly:none来隐藏标签
    • 如果需要频繁切换v-show比较好
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    	</head>
    	<body>
    		<div id="demo">
    			<p v-if="ok">成功了</p>
    			<p v-else="true">失败</p>
    			<p v-show="ok">表白成功</p>
    			<p v-show="!ok">表白失败</p>
    			<button type="button" @click="ok=!ok"></button>
    		</div>
    		<script type="text/javascript">
    			new Vue({
    				el:'#demo',
    				data:{
    					ok:false
    				}
    			})
    		</script>
    	</body>
    </html>
    

    3.列表渲染

    • vue本身只是监视了persons的改变,没有监视数组内部数据的改变
    • Vue重写了数组中一系列改变数组内部数据的方法(先调用并实现原生代码,再更新界面)
      数组内部改变,界面自动改变

    --3.1v-for遍历数组

    <li v-for="(p,index) in persons" :key="index">
    	{{index}}---{{p.name}}---{{p.age}}
    	---<button @click="deleteP">删除</button>
    	---<button @click="updateP(index,{name:'Cat',age:20})">更新</button>
    </li>
    
    

    练习

    --3.2v-for遍历对象

    <li v-for="(value,key) in persons[1]" :key="key">
    					{{value}}---{{key}}
    				</li>
    

    --练习代码

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    	</head>
    	<body>
    		<div id="demo">
    			<h2>测试:v-for 遍历数组</h2>
    			<ul>
    				<li v-for="(p,index) in persons" :key="index">
    					{{index}}---{{p.name}}---{{p.age}}
    					---<button @click="deleteP">删除</button>
    					---<button @click="updateP(index,{name:'Cat',age:20})">更新</button>
    				</li>
    			</ul>
    			<h2>测试:v-for 遍历对象</h2>
    			<ul>
    				<li v-for="(value,key) in persons[1]" :key="key">
    					{{value}}---{{key}}
    				</li>
    			</ul>
    		</div>
    		<script type="text/javascript">
    			new Vue({
    				el: '#demo',
    				data: {
    					persons: [ //vue本身只是监视了person的改变,没有监视数组内部数据的改变
    						{
    							name: 'Tom',
    							age: 18
    						},
    						{
    							name: 'Jack',
    							age: 16
    						},
    						{
    							name: 'Bon',
    							age: 19
    						},
    						{
    							name: 'Rose',
    							age: 14
    						},
    					]
    				},
    				methods: {
    					deleteP(index) {
    						//删除persons中指定index的p
    						this.persons.splice(index, 1)
    					},
    					updateP(index, newP) {
    						//没有改变persons本身。数组内部发生变化,但并没有调用变异方法,不会更新界面
    						this.persons.splice(index, 1, newP)
    					}
    				}
    			})
    		</script>
    	</body>
    </html>
    
    

    --3.3为什么要使用:key

    参考知乎问题(https://www.zhihu.com/question/61064119)

    --3.4变更方法

    • Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:
      • push()
      • pop()
      • shift()
      • unshift()
      • splice()
      • sort()
      • reverse()

    ----3.4.1splice()

    splice方法很强大,可实现数组的增删改


    • splice(index,0,newP)//idnex:数组索引,newP:新的内容,0:代表增加
    • 删除
      splice(index,1)

    • splice(index,1,newP)

    4.列表的搜索和排序

    --4.1代码

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    	</head>
    	<body>
    		<div id="test">
    			<input type="text"  v-model="searchName"/>
    			<ul>
    				<li v-for="(p,index) in filterPersons" :key="index">
    					{{index}}---{{p.name}}---{{p.age}}
    				</li>
    			</ul>
    			<button @click="setOrderType(1)">年龄升序</button>
    			<button @click="setOrderType(2)">年龄降序</button>
    			<button @click="setOrderType(0)">原本顺序</button>
    		</div>
    		<script type="text/javascript">
    			new Vue({
    				el: '#test',
    				data: {
    					searchName:'',
    					orderType: 0,//0代表原本,1代表升序,2代表降序
    					persons: [ //vue本身只是监视了person的改变,没有监视数组内部数据的改变
    						{
    							name: 'Tom',
    							age: 18
    						},
    						{
    							name: 'Jack',
    							age: 16
    						},
    						{
    							name: 'Bon',
    							age: 19
    						},
    						{
    							name: 'Rose',
    							age: 14
    						},
    					]
    				},
    				computed:{
    					filterPersons(){
    						//取出相关数据
    						const {searchName,persons}=this
    						//最终需要显示的数组
    						let fPersons;
    						//对persons进行过滤
    						fPersons = persons.filter(p=>p.name.indexOf(searchName)>=0)
    						orderType=this.orderType
    						//排序
    						if(orderType!==0){
    							fPersons.sort(function(p1,p2){
    								
    								if(orderType===2){
    									console.log(p1.name+" down"+p2.name)
    									return p2.age-p1.age
    								}else{
    									console.log(p1.name+" up "+p2.name)
    									return p1.age-p2.age
    								}
    							})
    						}
    						
    						return fPersons	
    					}
    				},
    				methods:{
    					setOrderType(orderType){
    						this.orderType = orderType
    					}
    				}
    			})
    		</script>
    	</body>
    </html>
    
    
    
  • 相关阅读:
    关于JSONP
    使用stylelint对CSS/Sass做代码审查
    关于input的file框onchange事件触发一次失效的新的解决方法
    HTML5 之 FileReader(图片上传)
    document.domain
    window.hostory(浏览器的历史记录)
    事件DOMContentLoaded和load的区别
    JavaScript中---作用域
    关于repaint(重绘)和reflow( 回流)
    bootstrap兼容性问题
  • 原文地址:https://www.cnblogs.com/psyduck/p/14358647.html
Copyright © 2011-2022 走看看