Vue 3 如何观看地图

Posted

技术标签:

【中文标题】Vue 3 如何观看地图【英文标题】:Vue 3 how to watch Map 【发布时间】: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/

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Vue 3 如何观看地图的主要内容,如果未能解决你的问题,请参考以下文章

vue高德地图 如何一次添加多个点标记到地图实例?

如何使用 Inertia Js、Vue 和 Laravel 重新加载持久布局或观看道具

Vue JS - 当其中使用的字段更新时,观看计算如何触发它?

vue项目使用高德地图

vue使用高德地图和mars3d地图如何切换

百度地图百度地图的使用方法 和 在vue中如何使用百度地图(超详细)