• Vue 如何监听 localstorage的变化


    一. 说明


    在日常开发中,我们经常使用localStorage来存储一些变量。这些变量会存储在浏览中。对于localStorage来说,即使关闭浏览器,这些变量依然存储着,方便我们开发的时候在别的地方使用。

    二. localStorage的使用


    存储值:window.localStorage.setItem(‘键名’, 值)
    读取值:window.localStorage.getItem('‘键名’)


    三. 监听localStorage值的变化

    1. 在utils中新建一个文件watchLocalStorage.ts
    1. export default function dispatchEventStroage() {
    2. const signSetItem = localStorage.setItem
    3. localStorage.setItem = function (key, val) {
    4. let setEvent = new Event('setItemEvent')
    5. setEvent.key = key
    6. setEvent.newValue = val
    7. window.dispatchEvent(setEvent)
    8. // eslint-disable-next-line prefer-rest-params
    9. signSetItem.apply(this, arguments)
    10. }
    11. }

    2. 在main.js中引入并挂载

    1. import dispatchEventStroage from './utils/watchLocalStorage'
    2. Vue.use(dispatchEventStroage);

    3.在需要监听的地方使用如下代码

    1. mounted () {
    2. // 监听localhostStorage的数据变化,结合utils/tool.js配合使用
    3. const that=this
    4. window.addEventListener('setItemEvent', function (e) {
    5. if (e.key === 'myKey') { // myKey是需要监听的键名
    6. that.mykey = e.newValue;
    7. console.log(JSON.parse(e.newValue)) // 这里的newValue就是localStorage中,键名为myKey对应的变化后的值。
    8. console.log('本地存储值发生变化:', e.newValue)
    9. }
    10. })
    11. },

     特别注意:
    我刚开始做的时候,考虑不周,没有写const that=this 这一句,我用的如下代码,一直报错,赋值不了,如下代码是错误的,
    为什么要用const that=this这一个呢?
    那是因为在JavaScript中,this代表的是当前对象,他是会随程序运行不停改变的,
    如果用this的话,this是addEventListener监听中当前的对象,所以赋值的时候不能赋值到外面去。
    const that = this 其实就是在this改变之前先复制一份给that,那么在程序后面的运行中就可以用that来赋值该函数以外的对象了,比如that.order

    四.另外提供一种方法 vuex

    利用 const that=this,可以将值存进store中,

    1. this.od2Visible = true;
    2. this.title = '舰船航线规划';
    3. this.$store.commit("tools/setzhk", 'od5');
    4. var tempList = [];
    5. const that = this;
    6. var handler = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas); // 创建鼠标事件handler
    7. handler.setInputAction(function(click) { // 监听鼠标左键点击事件
    8. // 获取点击位置的地球坐标
    9. var cartesian = window.viewer.camera.pickEllipsoid(click.position, window.viewer.scene.globe.ellipsoid);
    10. // 转换为笛卡尔坐标系
    11. let cartographic1 = Cesium.Cartographic.fromCartesian(cartesian);
    12. // 转换为经纬度
    13. var latitude = Cesium.Math.toDegrees(cartographic1.latitude);
    14. var longitude = Cesium.Math.toDegrees(cartographic1.longitude);
    15. tempList.push(longitude,latitude)
    16. if (cartesian) {
    17. var entity = window.viewer.entities.add({ // 在该位置添加点
    18. position: cartesian,
    19. point: {
    20. pixelSize: 10,
    21. color: Cesium.Color.YELLOW
    22. }
    23. });
    24. }
    25. localStorage.setItem('lonlan',tempList)
    26. that.$store.commit("tools/setlonlat", tempList);
    27. console.log(1001,that)
    28. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

    然后再使用 用 计算属性 computed 和 watch 监听实现

    1. computed: {
    2. lonlat(){
    3. return this.$store.state.tools.lonlat
    4. }
    5. },
    6. watch: {
    7. lonlat(newVal,oldVal){
    8. console.log(1002,newVal,oldVal)
    9. }
    10. },

  • 相关阅读:
    【谷粒商城 - k8s、devOps专栏】
    Flody的应用
    linux部署minio对象存储、docker部署minio象存储、k8s部署minio象存储
    [HDLBits] Exams/m2014 q4k
    S7-1200PLC红灯闪烁报警,提示“硬件组件已移除或缺失”的原因分析
    【java_wxid项目】【第二章】【Spring Cloud Alibaba Nacos集成】
    初识Spring
    Arduino驱动FXLN83XXQ三轴加速度传感器(惯性测量传感器篇)
    NTFS Disk by Omi NTFS for mac v1.1.4中文版
    那个热血澎湃的少年,他居然顶不住了!
  • 原文地址:https://blog.csdn.net/askuld/article/details/133173014