【问题标题】:Vue 3 how to watch MapVue 3 如何观看地图
【发布时间】:2021-03-20 07:19:04
【问题描述】:

我将映射传递给组件,然后返回新值并更新映射。这会触发地图上的手表,但传递的新旧值是相同的。

在这种情况下是否有可能让手表接收旧值?

(function() {

const ui = {
setup() {
  const map = reactive(new Map([
    ['width', 800],
    ['height', 400]
  ]));

  function onCompUpdate(evt) {
    console.log(map.get('width'), map.get('height'), evt[0], evt[1]);
map.set('width', Number(evt[0]));
    map.set('height', Number(evt[1]));
  }
  
  watch(map, (n,o)=>{
  console.log(n.get('width'), n.get('height'), 
  o.get('width'), o.get('height'));
  });

  return { map, onCompUpdate };
  },
};

const vueApp = createApp(ui);

vueApp.component('base-input', {
props: ['some' ], emits: ['comp-update'],
setup(props, { emit }) {

  let chars = ref(Array.from(props.some.values()).join(','));

  function checkInput(val) {
    emit('comp-update', val.split(','));
    chars.value = val;
  }

  return { chars, checkInput };
},
template: `<input type="text" spellcheck="false" :value="chars"
input="checkInput($event.target.value)"/>`
});

vueApp.mount('#vue');

})();

HTML:

<div id="vue">
  <base-input :some="map" @comp-update="onCompUpdate($event)"></base-input>
</div>

小提琴: https://jsfiddle.net/tfoller/sm28u7r0/35/

【问题讨论】:

    标签: javascript vue.js vue-component vuejs3 vue-reactivity


    【解决方案1】:

    发生这种情况是因为对旧的和新的引用是相同的。这是一种解决方法。与其直接观看参考资料,不如观看参考资料的传播,这确实会发生变化。它必须在函数表达式中完成,因为展开不是反应式的:

    watch(() => [...map], (nArray, oArray)=>{
        const n = new Map(nArray);
        const o = new Map(oArray);
        console.log(n.get('width'), n.get('height'), o.get('width'), o.get('height'));
    });
    

    由于spread 将地图转换为数组,因此您可以在手表内部将值转换回地图。

    这是你的updated fiddle

    【讨论】:

      【解决方案2】:

      只有在整个地图被替换时才会触发手表。如果你想观察突变(添加/删除项目),你需要像这样设置deep: true

      watch(myMap, () => {
        // myMap was mutated
      }, { deep: true })
      

      Working SFC Playground example

      【讨论】:

        猜你喜欢
        • 2021-09-26
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-16
        • 2021-04-03
        • 2020-03-26
        • 2021-12-27
        相关资源
        最近更新 更多