2022-05-09 09:14:03
Vue.prototype.$addStorageEvent = function (type, key, data) {
  if (type === 1) {
  // 创建一个StorageEvent事件
  var newStorageEvent = document.createEvent('StorageEvent');
  const storage = {
      setItem: function (k, val) {
          localStorage.setItem(k, val);
          // 初始化创建的事件
          newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
          // 派发对象
          window.dispatchEvent(newStorageEvent);
      }
  }
  return storage.setItem(key, data);
} else {
  // 创建一个StorageEvent事件
  var newStorageEvent = document.createEvent('StorageEvent');
  const storage = {
      setItem: function (k, val) {
          sessionStorage.setItem(k, val);
          // 初始化创建的事件
          newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null);
          // 派发对象
          window.dispatchEvent(newStorageEvent);
      }
  }
  return storage.setItem(key, data);
}
}
this.$addStorageEvent(2, "butCountNum", this.butCount);
在mouted钩子函数中进行监听
window.addEventListener('setItem', (e) => {
      if(e.key === "butCountNum"){
          //写逻辑
      }
<script>
export default {
    name: "app",
    // 数据
    data() {
        return {};
    },
    // 方法
    methods:{},
    // 侦听器
    watch:{}
};
</script>一个简单的例子:
<template>
    <p>你点击按钮的次数是: {{ count }} </p>
    <button @click="add" v-model="count">点击</button>
</template>
<script>
export default {
    name: "app",
    data(){
        return {
            count:0
        }
    },
    methods:{
        add(){
            this.count++;
        }
    },
    watch:{
        // 被侦听的变量count
        count(){
            console.log('count 发生了变化');
        }
    }
};
</script>
<template>
    <input type="text" v-model="inputValue">
    <p>从输入框中获取到的数据:{{ passedInputValue }}</p>
</template>
<script>
export default {
    name: "app",
    data(){
        return {
            inputValue: '',
            passedInputValue: ''
        }
    },
    watch:{
        inputValue() {
            // 当inputValue数据发生变化以后,延迟三秒赋值给passedInputValue
            setTimeout(() => {
                this.passedInputValue = this.inputValue;
            }, 3000)
        }
    }
};
</script>watch:{
    inputValue(value,oldValue) {
        // 第一个参数为新值,第二个参数为旧值,不能调换顺序
        console.log(`新值:${value}`);
        console.log(`旧值:${oldValue}`);
    }
}
<template>
    <p>FullName: {{fullName}}</p>
    <p>FirstName: <input type="text" v-model="firstName"></p>
</template>
<script>
export default {
    name: "app",
    data(){
        return {
            firstName: 'Su',
            lastName: 'Junyang',
            fullName: ''
        }
    },
    watch:{
        firstName: {
            handler(newName, oldName) {
                this.fullName = newName + ' ' + this.lastName;
            },
            // 如果设置了false,那么在页面第一次渲染以后不会触发侦听器
            immediate: true
        }
    }
};
</script>data:{
    return {
        // 字符串发生变化,可以侦听
        firstName: 'Su',
        room:{
            name:"大床房",
            // 当房号发生变化的时候,侦听器并不能侦听到。
            // 因为侦听器只侦听到room,不能侦听number或者name
            number: 302
        }
    }
},watch:{
    room:{
        handler(newRoom,oldRoom){
            console.log("房间号发生了变化")
        },
        deep: true
    }
}<template>
  <div class="search">
    <input type="text" v-model="inputValue" />
    <div class="search-block" v-for="(element, index) in results" :key="index">
      {{ element }}
    </div>
  </div>
</template>
<script>
export default {
  name: 'app',
  data() {
    return {
      results: [],
      mockData: [
        '浙江大学',
        '中国人民大学',
        '清华大学',
        '清华大学附属中学',
        '浙江理工大学',
        '浙江工业大学'
      ],
      inputValue: ''
    };
  },
  watch: {
    inputValue(value) {
      if (!!value) {
        setTimeout(() => {
          this.results = this.mockData.filter(el => {
            console.log(value);
            return el.indexOf(value) !== -1;
          });
        }, 300);
      }
    }
  }
};
</script>