Vue的学习(2)

class与style的绑定

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .aClass{
      color: red;
    }
    .bClass{
      color: blue;
    }
    .cClass{
      font-size: 20px;
    }
  </style>
</head>
<body>
<div id="demo">
  <h2>1. class绑定: :class='xxx'</h2>
  <p class="cClass" :class="a">xxx字符串</p>
  <!--true false   里面是布尔值-->
  <p :class="{aClass:isA, bClass:isB}">xxx是对象</p>
  <p :class="['aClass', 'bClass']">xxx是对象</p>

  <h2>2. style绑定</h2>
  <p :style="{color:activeColor, fontSize:fontSize}">:style="{ color: activeColor, fontSize: fontSize + 'px' }"</p>


  <button @click="update">更新</button>


</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el:'#demo',
    data:{
      a:'aClass',
      isA:true,
      isB:false,
      activeColor:'red',
      fontSize:20 + 'px'
    },
    methods:{
      update(){
        this.a = 'bClass'
        this.isA = false
        this.isB = true
        this.activeColor = 'green'
        this.fontSize = 40 + 'px'
      }
    }

  })
</script>
</body>
</html>

条件渲染

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<!--
1. 条件渲染指令  都是true才显示
  v-if
  v-else
  v-show
2. 比较v-if与v-show
  如果需要频繁切换 v-show 较好
  v-if删除标签,看不到它,没了
  v-show设置了display为none,还在
-->
<div id="demo">
  <p v-if="ok">成功</p>
  <p v-else>失败</p> <!--不写 相当于相反-->

  <p v-show="ok">表白成功</p>
  <p v-show="!ok">表白失败</p>
  <button @click="ok=!ok">切换</button>
</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el:'#demo',
    data:{
      ok:true
    }
  })
</script>
</body>
</html>

列表渲染

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<div id="demo">
  <h2>测试: v-for 遍历数组</h2>
  <ul>
    <li v-for="(p , index) in persons " :key="index">  <!--一旦有v-for最好给一个key-->
      {{index}} ------ {{p.name}} ------- {{p.age}}
      ---- <button @click="deleteP(index)">删除</button>
      ---- <button @click="updateP(index, {name:'ZZ',age:21})">更新</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" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el:'#demo',
    data:{
      persons:[//Vue本身只是监视了persons的改变,没有监视数组内部数据的改变
        {name: 'Tom' , age: '18'},
        {name: 'Amy' , age: '11'},
        {name: 'DaMing' , age: '19'},
        {name: 'Rose' , age: '28'}
      ]
    },
    methods:{
      deleteP(index) {
        // Vue重写了数组中的一系列改变数组内部数据的方法,
        // 第一步使用原生的方法,第二步更新界面
        //这样就实现了数组内部改变,界面自动变化
        this.persons.splice(index , 1)
      },
      updateP(index, newP) {
        console.log('1')
        // this.persons[index] = newP
        // 印证上面的话,person指向的对象没变,只是内部数据变化了,
        // 但是并没有调用变异方法,vue不会更新界面
        this.persons.splice(index, 1 ,newP)

      }
    }
  })
</script>
</body>
</html>

列表过滤,列表排序

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<!--
1. 列表过滤
2. 列表排序
-->
<div id="demo">
  <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" src="../js/vue.js"></script>
<script type="text/javascript">
  new Vue({
    el:'#demo',
    data:{
      searchName:'',
      orderType:0,//0代表原本顺,1代表升序,2代表降序
      persons:[//Vue本身只是监视了persons的改变,没有监视数组内部数据的改变
        {name: 'Tom' , age: '18'},
        {name: 'Amy' , age: '11'},
        {name: 'DaMing' , age: '19'},
        {name: 'Rose' , age: '28'}
      ]
    },
    computed:{
      filterPersons(){
        // 在computed属性对象中定义计算属性的方法
        //初始化显示时执行,相关的data属性数据发生改变时执行  怕忘了
        console.log('fullName1')

        //取出相关数据
        const {searchName,persons,orderType} = this
        //最终需要显示的数组
        let fpersons

        //这里写了两种写法,都可以,第一种方便理解,因为不了解filter
        //这里会在下方引用别人的代码解释一下filter

        //对persons进行过滤
        // fpersons = persons.filter(p => {
        //   return p.name.indexOf(searchName)!==-1
        // })
        // return fpersons
        
		//indexOf满足就返回0,不满足就返回-1
        // 这里疑惑一开始为什么会显示,因为一开始空串,查了下资料
        // 源码里有个条件是如果字符串长度等于0,返回0
        // (没有为什么,人家就说这样定义的)
        fpersons = persons.filter(x => x.name.indexOf(searchName)!==-1)

        //排序
        if (orderType!==0){
          fpersons.sort(function (p1, p2) {
            //如果返回负数,p1在前,返回正数,p2在前 这个记住就好了,主要是排序
            //p1-->p2就是升序  p2-->p1就是降序
            //两种情况
            if (orderType === 2){
              return p2.age - p1.age
            }else{
              return p1.age - p2.age
            }
          })
        }
        return fpersons
      }
    },
    methods:{
      // 这里收到值,然后改变data值,然后UI那位data变了,所以就要执行computed
      setOrderType(orderType) {
        this.orderType = orderType
      }
    }
  })
</script>
</body>
</html>

解释filter


filter方法可以遍历数组

filter方法的参数是函数

filter方法函数有形参v

形参v指的是数组中每个元素

filter方法中函数有返回值(把符合条件的元素放在一个新数组中返回)

和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

示例:

const arr = [1,2,3].filter((v)= > {
     console.log(v);  //输出为1,2,3
     return v>1;
})
console.log(arr);  //输出为[2,3];

sort()

var array = [4, 2, 5, 3, 1];
function compare(a, b) {
console.log(a,b);
return a - b;
}
array.sort(compare);
输出结果:
在这里插入图片描述

第一行输出2 4,2-4<0,2移到4前面,数组为[2,4,5,3,1]

第二行输出5 2,5-2>0,数组不变

第三行输出5 4,5-4>0,数组不变

根据前三行的输出规律,接下来输出依次应该是3 2,3 4,3 5,然而第四行却直接输出了3 4,这是因为算法使用了二分法,提高比较效率,3-4<0,3移到4前面,数组为[2,3,4,5,1]。

由于3<4,所以第五行直接比较3 2,3-2>0,数组不变

第六行,依旧按照二分法,从1 4,开始比较,1-4<0,1移到4前面,数组为[2,3,1,4,5]

同理,第七行结果为[2,1,3,4,5],第八行结果为[1,2,3,4,5],排序完毕。

发现学习到后面还是基础比较重要,这些方法以前学过但是没有很重视,也算一个重新学习加深记忆的过程吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值