Vue基本语法day03

版权声明:转载-复用,请联系博主微信:qiang510939237 https://blog.csdn.net/qiang510939237/article/details/89324029
  1. data 变化,引发的事情?
    data 里的数据发生了变化,指令会重新计算
    data 里的数据发生了变化,表达式会重新计算

    <div id="app">
      <h1>{{ num }}</h1>
      <h1 v-show="getShow()">w shi h1</h1>
      <h1>{{ num >= 105 ? '大' : '小' }}</h1>
    </div>
    
    <script src="./vue.js"></script>
    
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          num: 100
        },
        methods: {
          getShow() {
            console.log('执行了')
            return true
          }
        }
      })
    </script>
    
  2. key 的 就地复用策略

     问题: '就地复用策略' ==> 默认特定的索引下显示 ==> 默认 :key="index"
     解决办法 : 添加一个 key   :key='item.id'  ==> 随着id走
     
     取 key : 
          1. 最理想的是取每个元素的id  ==> :key='item.id'
          2. 取 数组里元素对象里的属性   (固定、唯一)
      
     总结 :
      1. 以后使用 v-for 尽量添加 :key
      2. :key='item.id'
    
     <div id="app">
       <p v-for="(item,index) in list" :key="item.name">
         {{ item.id }} {{ item.name }} <input type="text" />
       </p>
     </div>
     
     <script src="./vue.js"></script>
     <script>
       const vm = new Vue({
         el: '#app',
         data: {
           list: [
             { id: 1, name: '法王', done: true },
             { id: 2, name: '浪涛', done: false },
             { id: 3, name: '长虹', done: false }
           ]
         }
       })
     </script>
    
  3. 响应数据问题

    双向数据绑定完成 => 响应数据完成 
    1. data里面 / obj / name ==> ok
    2. data/obj.name没有,在一个按键事件里面 点击 => 动态添加数据 => 官网: vue无法监听到属性添加和删除
    => 无法正常进行数据响应 
    
    总结: 以后想要完成正常的数据响应,应该怎么做?
    1. 方式1: (最推荐) 先在 data 里声明好,给一个初始值 , 0/'' , 再去使用 
    2. 方式2: ($set), 第三方  this.$set(this.obj,'name','ls')
    
    <div id="app">
          <input type="text" v-model="obj.name" />
          <button @click="fn">按钮</button>
    </div>
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          // obj: {
          //   age: '',
          //   sex : ''
          // }
        },
        methods: {
          fn() {
            console.log(123)
    
            // 动态添加数据
            // this.obj.name = 'ls'
    
            // 需求 : 就要动态的添加数据,还想要正常的数据绑定 , 数据响应
            // 参数1 : 对象
            // 参数2 : 属性
            // 参数3 : 初始值
            this.$set(this.obj, 'name', 'ls')
          }
        }
      })
    </script>
    
  4. 事件修饰符

     按键修饰符 .enter .down等等  
     事件修饰符  .prevent
        .stop =>  阻止冒泡
        .prevent => 阻止默认行为
        .capture => 捕获
        .self  => 点击自己才会触发
        .once  => 只能点击一次
        .passive => 不要去判断冒泡还是捕获 => 冒泡去执行 => 提高性能 
    
     <div id="app">
       <a href="http://baidu.com" @click.prevent="fn">点我啊</a>
       <button @click.once="fn">按钮</button>
     </div>
     
     <script src="./vue.js"></script>
     <script>
       const vm = new Vue({
         el: '#app',
         data: {},
         methods: {
           fn(e) {
             // 事件对象阻止默认行为
             // e.preventDefault()
    
             console.log('我被点到了')
           }
         }
       })
     </script>
    
  5. 异步DOM更新

      DOM更新是异步的  => 为了性能的考虑
      演示证明一下 : 异步
      解决办法 : 延时器 、$nextTick
    
      延时器(只执行一次的定时器)
    
    <div id="app">
      <h1>{{ num }}</h1>
      <button @click="fn">按钮</button>
    </div>
    
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          num: 100
        },
        methods: {
          fn() {
            // num +1
    
            // 获取data里数据情况
            // console.log(this.num) //100
            // this.num++
            // console.log(this.num) //101
    
            // 获取DOM里的数据
               console.log(document.querySelector('h1').innerText) //100
               this.num++ // 101
            // console.log(document.querySelector('h1').innerText) //100
    
            // 方式1 : 添加一个延时器
            // setTimeout(() => {
            //   console.log(document.querySelector('h1').innerText)
            // }, 0)
            
            // 方式2 : DOM更新完了,告诉我,我再去获取
            // this.$nextTick(() => {
            //   console.log(document.querySelector('h1').innerText)
            // })
          }
        }
     })
    
      // 异步 =>  不阻塞代码
      // console.log(11111)
      // // 异步
      // //1. 不阻塞代码
      // //2. 异步的代码感觉慢一拍 => 延时的感觉
      // setTimeout(() => {
      //   console.log('123')
      // }, 3000)
      // setTimeout(() => {
      //   console.log('321')
      // }, 0)
    
      // console.log(22222)
    </script>
    
  6. 数据更新

     数据发生变化,不是立马就更新的,而是数据不变了,再去一次性更新的
     总结: 
     	1. 数据发生变化了,不是立马更新的,而是当数据不变了,一次性更新的
     	2. 更新 DOM 是异步的
     	 - 方式 :  this.$nextTick()   ==   获取DOM数据 (其他的)
     
     数据持久化
     	1. 本地持久化, 数据保存到本地
     	2. localStorage(本地存储)
     	3. 方式: 
     		3.1 在增删改查下每一个功能里面,都要做一次保存处理 (繁琐)
     		3.2 监听数据 (数组 list) 变化,拿到最新的数据,保存到本地 (代码只需要写一次)
     	4. vue里面,提供了一个 watch (监听器)
    
  7. watch 监听器 (监听数据发生的变化)

     <div id="app">
       <h1>{{ num }}</h1>
     </div>
     
     <script src="./vue.js"></script>
     <script>
       const vm = new Vue({
         el: '#app',
         data: {
           num: 100
         },
         // 监听器
         watch: {
           num(newVal, oldVal) {
             console.log('新值:', newVal, '旧值 :', oldVal)
           }
         }
       })
     </script>
    

    watch 监听器-小案例

    <!--需求: 监听一个文本框字符的个数(3-6),如果没有满足要求,提示:格式 不正确 -->
    
    <div id="app">
      <input type="text" v-model="name" />
      <span v-show="isShow">格式 不正确</span>
    </div>
    
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          name: '',
          isShow: false
        },
        watch: {
          // 监听name
          name(newVal) {
            if (newVal.length >= 3 && newVal.length <= 6) {
              // console.log('格式 正确')
              this.isShow = false
            } else {
              // console.log('格式 不正确')
              this.isShow = true
            }
          }
        }
      })
    </script>
    

    watch 监听复杂类型

    <div id="app">
      <input type="text" v-model="obj.name" />
    </div>
    
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          obj: {
            name: 'zs'
          }
        },
        //监听 对象,监听name的值
        watch: {
          // obj 监听的是地址, 这种方式:只能监听基本数据类型
          // obj(newVal) {
          //   console.log(newVal.name)
          // }
          //方式1: 监听复杂类型
          // obj: {
          //   // 深度监听
          //   deep: true,
          //   // 处理函数
          //   handler(newVal) {
          //     console.log(newVal.name)
          //   }
          // }
          //方式2: 粗暴的监听对象里面的属性 (字符串形式)
          'obj.name'(newVal) {
            console.log(newVal)
          }
        }
      })
    </script>
    
  8. computed 和 watch的区别?
    computed: 计算属性

     	1. 根据已知值,得到一个新值
     	2. 新值随着已知值(相关的数据) 变化而变化
     1. 计算属性 => (得到的是) 新值
     2. 计算属性(num) ==> 是别人影响了我
    

    watch: 监听器

     1. 监听 ==> (监听) 已知值
     2. 监听数据 (num2) ==> 是我影响到了别人
    
    <div id="app">
      <h1> 计算属性 {{ num }} </h1>
    </div>
    
    <script src="./vue.js"></script>
    <script>
      const vm = new Vue({
        el: '#app',
        data: {
          num1: 100,
          num2: 200
        },
        // 计算属性
        computed: {
          num() {
            return this.num1 + 10
          }
        },
        // 监听器
        watch: {
          num2(newVal) {
            console.log(newVal)
          }
        }
      })
    </script>
    
  9. ES6 语法的简写

     let name = 'zs'
     let age = 40
     let aaa = 'sex'
     let obj = {
       // name : name,
       name,
       age,
       sayHi() {
         console.log('哈哈')
       },
       'aaa-bbb': '123',
        aaa: '男',
        [aaa]: '男'
     }
     
     // es6 简写
     // 1. 如果属性名 和 属性值(变量)  一样 == > 省略一个
     // 2. 方法也可以简写  sayHi(){}
     // 3. 命名规则: 数字、字母、_、$ 组成,如果没有按照命名规则来命名,外面加一个 ''
     // 4. 属性名也是一个变量,想读取变量的数据,不能直接写,因为如果直接写了就是当前属性了,
     //    如果读取这个变量的值  [aaa]
     
     console.log(obj) 	
    
  10. 过滤器 (数据格式化工具)
    作用: 根据一个不满足条件的数据,让过滤器处理(数据格式化),处理成想要的结果 (使用引入了 Vue包,全局就能使用Vue对象)
    使用:

    1. 先注册
    2. 再使用  格式:  要处理的数据 | 过滤器
    

    注册:

    1. 全局过滤器: 在所有的vue实例中都可以使用
    2. 局部过滤器(私有过滤器): 只能在当前注册过滤器的vue实例里面使用
    

    注册全局过滤器?

    过滤器的定义语法:
    		Vue.filter('过滤器的名称', function(){ })
    		过滤器中的 function , 第一个参数,已经被规定死了,永远都是 过滤器 管道符前面 传递过来的数据
    		Vue.filter('过滤器的名称', function(data) { 
    			return data + '123'
    		})
    过滤器调用时候的格式:   {{ name | 过滤器的名称 }}
    

    <div id="app">
      <h1>{{ date }}</h1>
      <h1>{{ date | dateFilter }}</h1>
    </div> 
    
    <script src="./vue.js"></script>
    <script>
      // 注册全局过滤器
      // 1. 注册要在vue实例之前注册
      // 2. 要给一个return值, return后的值,就是过滤后的结果
    
      // 参数1 : 过滤器的名字
      // 参数2 : 回调函数, 谁用了我这个过滤器,就会执行这个回调函数
      			回调函数中的参数: 传过来未处理的数据
      Vue.filter('dateFilter', () => {
        return '要下课了'
      })
    
      const vm = new Vue({
        el: '#app',
        data: {
          date: new Date()
        }
      })
    </script>
    

    全局过滤器+moment插件

    <!-- 
        使用 moment 插件 : 格式化日期 
        1. 安装: npm i moment 
        2. 引入: moment.js
        3. 使用: moment(res).format('YYYY-MM-DD hh:mm:ss')
    -->
      
    <div id="app">
      <h1>{{ date | dateFilter }}</h1>
      <h1>{{ date1 | dateFilter }}</h1>
    </div>
    
    <script src="./vue.js"></script>
    <script src="./node_modules/moment/moment.js"></script>
    <script>
      // 注册全局过滤器
      Vue.filter('dateFilter', res => {
        return moment(res).format('YYYY-MM-DD hh:mm:ss')
      })
    
      const vm = new Vue({
        el: '#app',
        data: {
          date: new Date(),
          date1: +new Date()
        }
      })
    </script>
    

猜你喜欢

转载自blog.csdn.net/qiang510939237/article/details/89324029