Vue学习笔记03

68 阅读1分钟

1.监视属性

基本监视

watch:

  1. 当被监视的属性变化时,回调函数自动调用,进行相关操作。

  2. 监视的属性必须存在,才能进行监视!!

  3. 监视的两种写法:

    1. new Vue时传入watch配置
    2. 通过vm.$watch监视
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 isHot: true
             }
         },
         watch: {
             isHot: {
                 handler(newValue, oldValue) {
                     console.log('值发生改变了');
                     console.log(newValue, oldValue);
                 }
             }
         }
     });
 </script>

深度监视

  1. Vue中的watch默认不监测对象内部值的改变(一层)。
  2. 在配置deep: true可以监测对象内部值改变(多层)。

备注

  1. Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
  2. 使用watch时根据数据的具体结构,决定是否采用深度监视。
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 user: {
                     name: '',
                     age: null
                 }
             }
         },
         watch: {
             user: {
                 deep: true,
                 handler(newValue, oldValue) {
                     console.log('值发生改变了');
                     console.log(newValue, oldValue);
                 }
             }
         }
     });
 </script>

简写方式

当只需要配置handler函数的时候可以采用简写的方式。(类似于计算属性的简写方式)

 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 user: {
                     name: '',
                     age: null
                 }
             }
         },
         watch: {
             user(newValue, oldValue) {
                 console.log('值发生改变了');
                 console.log(newValue, oldValue);
             }
         }
     });
 </script>

2. 绑定样式

class绑定

  1. 字符串写法。适用于:样式的类名不确定,需要动态指定。
 <body>
     <div id="root">
         <div @click="changeMood" class="basic" :class="mood"></div>
     </div>
 </body>
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 mood: 'normal'
             }
         },
         methods: {
             //字符串方式更改样式
             changeMood() {
                 this.mood = 'sad';
             }
         },
     })
 </script>
  1. 数组写法。适用于:要绑定的样式个数不确定,名字也不确定。
 <body>
     <div id="root">
         <div @click="changeMood2" class="basic" :class="moodArr"></div>
     </div>
 </body>
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 moodArr: ['normal', 'sad', 'happy']
             }
         },
         methods: {
             //字符串方式更改样式
             changeMood2() {
                 this.moodArr = ['sad'];
             }
         },
     })
 </script>
  1. 对象写法。适用于:要绑定的样式个数确定、名字也确定。但要动态决定用不用。
 <body>
     <div id="root">
         <div @click="changeMood3" class="basic" :class="moodObj"></div>
     </div>
 </body>
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 moodObj: {
                     normal: true,
                     sad: false,
                     happy: true
                 }
             }
         },
         methods: {
             //字符串方式更改样式
             changeMood3() {
                 this.moodObj.happy = false;
             }
         },
     })
 </script>

style绑定

  1. 对象方式绑定。
 <body>
     <div id="root">
         <div @click="changeMood3" :style="styleObj" :class="moodObj"></div>
     </div>
 </body>
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 styleObj: {
                     color: 'red'
                 },
                 styleArr: [{
                     fontSize: '40px',
                     color: 'red'
                 }, {
                     backgroundColor: 'red'
                 }]
             }
         },
         methods: {
         },
     })
 </script>
 ​
  1. 数组方式绑定。
 <body>
     <div id="root">
         <div @click="changeMood3" :style="styleArr" :class="moodObj"></div>
     </div>
 </body>
 <script>
     new Vue({
         el: '#root',
         data() {
             return {
                 styleArr: [{
                     fontSize: '40px',
                     color: 'red'
                 }, {
                     backgroundColor: 'red'
                 }]
             }
         },
         methods: {
         }
     })
 </script>
 ​