属性-方法-过滤器

computed

  • 处理data属性与属性的关系

  • 根据data属性的变化动态修改样式

  • 动态获取vuex的属性值

<div id="example">
    <!-- 模版表达式写法 -->
   <p>{{ msg.split('').reverse().join('') }}</p>
    <!-- 计算属性写法 有依赖缓存-->
   <p>{{reversedMsg}}</p>
   <!-- 方法写法 每当触发重新渲染时,调用方法将总会再次执行函数-->
   <p>{{ handleReversedMsg() }}</p>
    <!-- 结果为:<div class="active"></div> -->
   <div :class="classObject"></div>
   <!-- 计算属性 set和get配合使用 -->
   <div>个人爱好</div>
   <div><input type="checkbox" v-model="checkAll">全选</div>
   <div><input type="checkbox" v-model="eat">吃饭</div>
   <div><input type="checkbox" v-model="sleep">睡觉</div>
   <div><input type="checkbox" v-model="play">打游戏</div>
   
</div>
data: {
  msg: 'message',
  isActive: true,
  error: null,
  eat: false,
  sleep: false,
  play: false
},
computed: {
  reversedMsg() {
    return this.msg.split('').reverse().join('')
  },
  classObject() {
    return {
      active: this.isActive && !this.error,
      'text-danger': this.error
    }
  },
  checkAll: {
    get() {
      return this.eat & this.sleep & this.play
    },
    set(val) {  
      this.eat = val
      this.sleep = val
      this.play = val
    }
  }
},
methods: {
  handleReversedMsg() {
    return this.msg.split('').reverse().join('')
}

watch

  • 监听data的属性变化

  • 监听路由的变化处理对应的逻辑,也可以在这发起ajax请求

<input type="text" v-model="value1">
<input type="text" v-model="value2">
<input type="text" v-model="obj.key">
  data() {
    return {
      value1: '',
      value2: 'hello',
      obj: {
        key: 'object'
      }
    }
  },
  watch: {
    // 第一个参数是新值,第二个参数是旧值
    value1(newVal,oldVal) {
      if(newVal !== oldVal) {
        console.log('数据更新了')
      }
    },
    // 下面添加immediate将会在生命周期`beforeCreate`和`created`之间打印:'我会打印value2的初始值:hello'
    value2: {
      handler: function(val) {
         console.log(`我会打印value2的初始值:${val}`) 
      },
      immediate: true
    },
    // 对象属性的监听,下面的添加deep后会把obj的所有属性变化都监听
    obj: {
      handler: function(val) {
         console.log(`我有点浪费性能:${val.key}`) 
      },
      deep: true
    },
    // 下面这样写只会监听到obj对象的key属性的变化
    'obj.key': {
      handler: function(val) {
         console.log(`obj.key数据更新了:${val.key}`) 
      },
    }
  },

过滤器

<!--在bind和双大括号语法使用过滤器-->
<a :href="url | urlFormat">{{ msg | msgFormat | msgFormat2('参数1', '参数2') }}</a>
<!-- 过滤器写法 结果是<div class="success"></div>-->
<div :class="statusClass | statusFilter"></div>
<!-- 不使用过滤器写法 和上面的结果是一样的-->
<div :class="statusMap[statusClass]"></div>
// 全局过滤器
Vue.filter('urlFormat',function(url) {
    return url.replace(/baidu/g,'google')
}
// 组件私人过滤器
filters: {
    msgFormat(msg) {
      return msg.replace(/百度/g,'谷歌')
    },
    // msg是执行完msgFormat(msg)返回的结果
    msgFormat2(msg,arg1,arg2) {
      return msg+arg1+arg2
    },
    statusFilter(status) {
      const statusMap = {
        published: 'success',
        deleted: 'error',
      }
      return statusMap[status]
    }
},
data:{
    url: 'https://baidu.com',
    msg: '我是百度',
    statusClass: 'published',
    statusMap: {
      published: 'success',
      deleted: 'error',
    }
},

Last updated