vue基础(二)

1.css样式操作

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .classA {
      background-color: hotpink;
    }

    .classB {
      color: lawngreen;
    }

    .classC {
      font-size: 80px;
    }

    /* 1、类的操作
       2、style的操作
    */
  </style>
</head>

<body>
  <div id="root">
    <!-- 操作类 -->
    <!-- 当我不知道这个标签类到底是谁,那么就得动态获取 -->
    <p :class="myClass">我爱你赵丽颖</p>

    <!-- 当我知道哪些类是有的,但是不知道哪个起作用 -->
    <p :class="{classA:isA,classB:isB}">我爱你赵丽颖111</p>

    <!-- 当一个标签有很多类都生效,那么就使用数组的写法 -->
    <p :class="['classA','classB','classC']">我爱你赵丽颖222</p>


    <!-- 操作style -->
    <p :style="{color:myColor,fontSize:mySize}">我爱你赵丽颖333</p>
    <button @click="changeClass">点击修改类</button>
  </div>
  <script src="./js/vue.js"></script>
  <script>
    new Vue({
      el:'#root',
      data(){
        return {
          myClass:'classA',
          isA:false,
          isB:true,
          myColor:'blue',
          mySize:'40px'
        }
      },
      
      methods: {
        changeClass(){
          this.myClass = 'classB' //操作的是第一个p
          this.isA = !this.isA
          this.isB = !this.isB
        }
      },
    })
  </script>
</body>

</html>

 

2.v-if 和v-show 条件渲染

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    #box{
      width: 300px;
      height: 300px;
      background-color: red;
    }
  </style>
</head>
<body>
  <div id="root">
    <!-- v-if和v-show都会用
    v-if是删除了这个节点,也就是dom树上是没有这个节点的,内存中没有
    如果我们获取这个节点,获取不到,切换不频繁可以用来节省内存

    v-show不是对节点进行删除操作,而是给节点元素添加样式去操作的 display:none
    如果使用这个东西,节点是永远存在在dom树上的。内存中也是存在的,我们获取的时候怎么都可以拿到
    但是有可能拿到的东西样式是display:none  切换很频繁的时候,我们使用v-show


    -->
    <p v-if="isOk">表白成功</p>
    <p v-else>表白失败</p>
    

    <p v-show="isOk">求婚成功</p>
    <p v-show="!isOk">求婚失败</p>

    <button @click="update">点击切换</button>
    <!-- <div id="box"></div> -->
  </div>
  <script src="./js/vue.js"></script>
  <script>
    const vm = new Vue({
      el:'#root',
      data:{
        isOk:true,
      },
      methods: {
        update(){
          this.isOk = !this.isOk
        }
      },
    })
      // let box = document.getElementById('box')
      // let flag = true
      // box.onclick = function(){
      //   if(flag){
      //     box.style.backgroundColor = 'green'
      //   }else{
      //     box.style.backgroundColor = 'red'
      //   }
      //   flag = !flag
      // }

  </script>
</body>
</html>

 

3,列表的过滤

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <input type="text" placeholder="请输入查找的关键字" v-model="keyword">
    <ul>
      <li v-for="(person, index) in newPersons" :key="person.id">
          {{person.id}} --- {{person.name}} --- {{person.age}}
      </li>
    </ul>
  </div>
  <script src="./js/vue.js"></script>
  <script>
    /*
      分析:
        根据效果分析,数组用的是原来的数据还是新的数组
        1、假设用原来的数据,一上来展示没问题
        2、当keyword变化的时候监视它,我们可以在原数组当中删除不包含keyword的项
        3、当keyword的值又变为空串的时候,我们想回去回不去了
        到此为止,卡死了
        4、既然原数组没法做效果,就必须使用新的一个数组,而且这个数组一上来和原数组数据一样
        5、既然是新数组,那就一定要用计算属性,根据已有的原数组和keyword
    */

    new Vue({
      el:'#root',
      data(){
        return {
          //data当中的数据包含初始化的数据和要收集的数据
          
          keyword:'',
          persons:[
            {id:1,name:'zhaoliying',age:33},
            {id:2,name:'yangmi',age:34},
            {id:3,name:'ouyangnana',age:20},
            {id:4,name:'liuyifei',age:18},
          ] //代表的就是ajax回来的数据
        }
      },
      computed: {
        //这里面的数据不是初始化数据也不是要收集的数据,而是后面根据已有数据计算而来的
         // newpersons为compuated的属性,返回一个新数组
        newPersons(){
          // let keyword = this.keyword
          // let persons = this.persons
          let {keyword,persons} = this //对象的解构赋值


          // 原生js一步一步来
          // let result = []
          // for(let i = 0; i < persons.length; i++){
          //   if(persons[i].name.indexOf(keyword) !== -1){
          //     result.push(persons[i])
          //   }
          // }

          //原始函数
          // let result = persons.filter(function(item,index){
          //   //return后面一定是一个条件表达式 结果一定true或者false
          //   return item.name.indexOf(keyword) != -1
          // })
          
          //箭头函数(箭头函数在用的时候,如果内部有this,小心)
          // 字符串的indexOf方法,返回某个指定的子字符串值在字符串中首次出现的位置,如果没有出现,返回-1
          // 过滤掉没匹配的对象
          let result = persons.filter(item => item.name.indexOf(keyword) != -1)

          return result
        }
      },
      methods: {
        //无论是自己定义的回调函数 
        //还是以后我们共用的一些函数 
        //都在这个里面去写
      },
      watch:{
        //监视已有的数据,已有的数据发生了改变,我们就可以干点什么
      }
    })


  </script>
</body>
</html>

 

4.列表过滤和排序

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <input type="text" placeholder="请输入查找的关键字" v-model="keyword">
    <ul>
      <li v-for="(person, index) in newPersons" :key="person.id">
          {{person.id}} --- {{person.name}} --- {{person.age}}
      </li>
    </ul>
    <!-- @click="sortType = 0" 回调函数如果内部只有一行代码,完全可以把这行代码写在这,不用定义 -->
    <button @click="sortType = 0">原样排序</button>
    <button @click="sortType = 1">年龄升序</button>
    <button @click="sortType = 2">年龄降序</button>
  </div>
  <script src="./js/vue.js"></script>
  <script>
    /*
      过滤分析:
        根据效果分析,数组用的是原来的数据还是新的数组
        1、假设用原来的数据,一上来展示没问题
        2、当keyword变化的时候监视它,我们可以在原数组当中删除不包含keyword的项
        3、当keyword的值又变为空串的时候,我们想回去回不去了
        到此为止,卡死了
        4、既然原数组没法做效果,就必须使用新的一个数组,而且这个数组一上来和原数组数据一样
        5、既然是新数组,那就一定要用计算属性,根据已有的原数组和keyword
    */
    /*
      排序分析:
        1、排序首先要有一个参照数据,所以在data当中我们需要自定义一个数据用来表示排序规则和类型
        2、点击排序按钮的时候这个数据要发生响应变化,变化的值我们是自己设定好的
        3、再来说排序的逻辑,其实就是在计算属性过滤的基础上去加逻辑

    */

    new Vue({
      el:'#root',
      data(){
        return {
          //data当中的数据包含初始化的数据和要收集的数据
          keyword:'',
          persons:[
            {id:1,name:'zhaoliying',age:33},
            {id:2,name:'yangmi',age:34},
            {id:3,name:'ouyangnana',age:20},
            {id:4,name:'liuyifei',age:18},
          ], //代表的就是ajax回来的数据
          sortType:0  //0代表原样排序  1代表升序   2代表降序
        }
      },
      computed: {
        //这里面的数据不是初始化数据也不是要收集的数据,而是后面根据已有数据计算而来的
        newPersons(){
          //过滤
          let {keyword,persons,sortType} = this //对象的解构赋值
          // 过滤出name中包含keyword,返回新数组
          let result = persons.filter(item => item.name.indexOf(keyword) != -1)

          // let arr = [10,7,30]
          // arr.sort(function(a,b){
          //   return a - b
          // })

          //排序
          if(sortType !== 0){
            result.sort((a,b) => {
              if(sortType === 1){
                return a.age-b.age
              }else{
                return b.age-a.age
              }
            })
          }

          return result
        }
      },
      methods: {
        //无论是自己定义的回调函数 
        //还是以后我们共用的一些函数 
        //都在这个里面去写
        // changeType(num){
        //   this.sortType = num
        // }
      },
      watch:{
        //监视已有的数据,已有的数据发生了改变,我们就可以干点什么
      }
    })
  </script>
</body>
</html>

 

5,列表渲染

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <ul>
      <li v-for="(person, index) in persons" :key="person.id">
          {{person.id}} --- {{person.name}} --- {{person.age}}
      </li>
      <!-- 
        如果我们只是为了展示用的,key使用index没问题
        如果我们以后对这个数据还有增删改的操作,那么index效率不高并且更可怕的是会出问题
        key以后我们要使用的几乎都是id值,使用这个唯一标识可以提高我们列表渲染以及修改的效率
       -->
    </ul>
    <button @click="changeFirstObjName">点击修改第一个人的姓名</button>
  </div>
  <script src="./js/vue.js"></script>
  <script>
    new Vue({
      el:'#root',
      data(){
        return {
          persons:[
            {id:1,name:'zhaoliying',age:33},
            {id:2,name:'yangmi',age:34},
            {id:3,name:'ouyangnana',age:20},
            {id:4,name:'liuyifei',age:18},
          ]
        }

        
      },
      methods: {
        changeFirstObjName(){
          //第一种
          // this.persons[0].name = 'yingbao'
          //第二种 不行,修改数据,页面数据不会跟着改变
          // this.persons[0] = {id:1,name:'yingbao',age:33}
          // console.log(this.persons)
          //第三种,第一个参数为index, 第二个参数为删除元素的数量,第三个参数为代替的元素
          this.persons.splice(0,1,{id:1,name:'yingbao',age:33})
        }
        // data当中的数据,所有的对象属性都是响应式的,修改对象的属性,就会影响到页面更改
        // 修改数组的整体第一个值,页面不会发生改变,因为数组下标不是对象的属性,不是响应式数据
        //其实vm内部这个数组第一个数据已经改了,只是没有影响到页面

        // 数组的部分原生方法,被vue做了改变,名字和原生名字一样,但是已经不是原生方法了
        // vue 给这些方法添加了修改页面的功能,使得页面可以修改
      },
    })



    // {
        //   name:'liuyuan',
        //   girlF:{
        //     name:'zly',
        //     age:33,
        //     movies:[
        //       {id:1,name:'乘风破浪'}
        //     ]
        //   }
        // }
  </script>
</body>
</html>

 

6,事件相关

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <!-- 最初始的写法 -->
    <button v-on:click="test1">test1</button>
    <!-- 事件添加的简写 -->
    <button @click="test2">test2</button>
    <!-- 事件回调不带参数默认传递的是事件对象$event -->
    <button @click="test3">test3</button>
    <!-- 事件回调带了自己的参数 -->
    <button @click="test4('zhaoliying')">test4</button>
    <!-- 事件回调不但带了自己参数还要用到事件对象的东西 -->

    <button @click="test5($event,'zhaoliying')">test5</button>
    <!-- 原生事件对象:当事件触发的时候,浏览器会调用这个回调函数,浏览器会帮我们自动的封装一个对象
    作为实参传给回调函数的第一个形参,事件对象内部是和这次触发事件相关的所有信息 -->


    <!-- 阻止事件冒泡 -->
    <div style="width:300px;height:300px;background-color:red" @click="outer">
      <div style="width:100px;height:100px;background-color:green" @click.stop="inner"></div>
    </div>

    <!-- 取消浏览器的默认行为 -->
    <a href="http://www.atguigu.com" @click.prevent="removeDefault">点我去学习</a>

    <!-- 按键行为 -->
    <input type="text" @keyup.enter="testKey">

  </div>
  <script src="./js/vue.js"></script>
  <script>

    //清除控制台报错
    Vue.config.productionTip = false

    new Vue({
      el:'#root',
      methods: {
        test1(){
          console.log('test1调用')
        },
        test2(){
          console.log('test2调用')
        },
        //事件回调函数如果没有传递其它参数,默认传递过来的就是事件对象
        test3(event){
          console.log('test3调用',event.target.innerHTML)
        },
        test4(str){
          console.log('test4调用',str)
        },
        test5(event,str){
          console.log('test5调用',str,event.target.innerHTML)
        },
        outer(){
          console.log('outer执行')
        },
        inner(event){
          console.log('inner执行')
          //原生阻止冒泡
          // event.stopPropagation();
        },
        removeDefault(event){
          console.log('哈哈')
          //原生阻止浏览器默认跳转行为
          // event.preventDefault();
        },
        testKey(event){
          // if(event.keyCode === 13){
          //   console.log('回车触发')
          // }

          console.log('回车触发')
        }

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

 

7,自动收集表单数据

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <div id="root">
    <!-- //收集value值 -->
    <form action="">
      用户名:<input type="text" placeholder="请输入用户名" v-model="userInfo.username">
      密码:<input type="password" placeholder="请输入用户名" v-model="userInfo.password">
      <br>
      <!-- //单选框, -->
      性别:
      <input type="radio" name="sex" value="male" v-model="userInfo.gender"><input type="radio" name="sex" value="female" v-model="userInfo.gender"><br>

      <!-- 多选框 -->
      爱好:
      🏀<input type="checkbox" value="basketball" v-model="userInfo.fav"><input type="checkbox" value="football" v-model="userInfo.fav">
      🏓<input type="checkbox" value="pingpang" v-model="userInfo.fav">
      <br>
      城市:
      <select v-model="userInfo.cityId">
        <!-- select 收集的数据是选中的选项的value值 -->
        <option :value="city.id" v-for="(city, index) in cities" :key="city.id">{{city.name}}</option>
      </select>
      <br>
      <br>
      <br>
      <br>
      自我简介:
      <textarea v-model="userInfo.des"></textarea>
      <br>
      <!-- 阻止默认行为 ,form表单中,默认button是提交跳转,需要阻止默认事件 -->
      <button @click.prevent="submit">提交</button>
    </form>
  </div>
  <script src="./js/vue.js"></script>
  <script>
    new Vue({
      el: '#root',
      data() {
        return {
          cities: [
            { id: 1, name: '北京' },
            { id: 2, name: '上海' },
            { id: 3, name: '深圳' },
          ],
          userInfo: {
            username: '',
            password: '',
            gender: '',
            //必须用数组来初始化,多选框
            fav: [],
            cityId: '',
            des: ''
          }
        }
      },
    })
  </script>
</body>

</html>

 

8,vue内置指令

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="root">
    <!-- <h2>我爱你</h2> -->
    <p v-text="msg"></p>

    <!-- 我爱你   会解析标签-->
    <p v-html="msg" ref="p2"></p>

      <!-- <h2>我爱你</h2> -->
    <!-- <p>{{msg}}</p> -->
    
    <button @click="test">test</button>
  </div>
  <script src="./js/vue.js"></script>
  <script>
  
    new Vue({
      el:'#root',
      data:{
        msg:'<h2>我爱你</h2>'
      },
      methods: {
        test(){
             //获取p元素$refs.p2
          console.log(this.$refs.p2.innerText) //我爱你
        console.log(this.$refs.p3.innerHTML) //<h2>我爱你</h2>
        console.log(this.$refs.p3.innerText) //我爱你
        }
      },
    })
  </script>
</body>
</html>

 

posted @ 2020-08-11 15:43  全情海洋  阅读(195)  评论(0编辑  收藏  举报