vue.js - 观看 Prop 从 child 体内传递过来

标签 vue.js vuejs2 vue-cli-3

我无法理解 Vue 中的监视机制。

我有一个父组件,它将车辆对象传递给子组件。

车辆:

{
  Number : 'some number', 
  Position: { lat: 'some lat', lng: 'some long', }
}

现在我有一个计时器来更新父对象中的这个对象。 child 也反射(reflect)了变化。在 child 内部,我实际上将此车辆对象作为标记放置在 map 上。

我在这里想做的是观察 Prop (车辆)的变化,如果它发生变化,那么我想平滑/动画标记到新更新的位置。

我尝试这样做:

watch: {

vehicle: function(newVal, oldVal){
 console.log('newVal'); 
}

},

它不起作用,没有打印任何东西。我是否必须在父组件中创建观察者才能观看并执行该动画?或者 child 可以观看传递给它的属性(property)?

编辑:

父级中车辆对象的更改:

如果从实时数据库接收数据,那么我所做的是,我维护一个父数组,我循环它以显示标记。

现在我循环数组并将新数据与其匹配,然后简单地更新已更新的值。

//一些随机位置

var positions = [
                    {
                        lat: 24.827393, lng: 67.021769,
                    },
                    {
                        lat: 24.827279, lng: 67.028294,
                    },
                    {
                        lat: 24.834947, lng: 67.024829,
                    },
                    {
                        lat: 24.835719, lng: 67.012825,
                    },
                    {
                        lat: 24.8274599, lng: 67.0322483,
                    },
                ];

                var random = Math.floor((Math.random() * positions.length - 1) + 1);



    this.vehicles[0].position.lat: positions[random].lat;
this.vehicles[0].position.lng: positions[random].lng;

后来我将它绑定(bind)到我的子组件,如下所示:

  <CustomMarker :key="vehicle.number" v-bind:vehicle="vehicle"
                      v-for="(vehicle, index) in vehicles"></CustomMarker>

基本上,上面的随机位置数组只是为了测试我的平滑移动,完成后我将实时接收相同的坐标。

最佳答案

您的观察者只会响应直接对 vehicle 属性的更改,不会vehicle 对象或其后代的属性所做的更改。我的意思是,如果父组件改变车辆对象,例如:

this.vehicle.Position.lat = 123

并且 this.vehicle 绑定(bind)到子组件的 vehicle 属性,那么观察者不会被触发,因为它仍然是相同的 vehicle 对象实例。

如果家长这样做:

this.vehicle = someOtherVehicle

然后观察者将被触发。

您可以通过将 deep 设置为 true 来指示 Vue 监视 vehicle 对象(及其后代)的属性更改:

watch: {
  vehicle: {
    deep: true,
    handler(newVal, oldVal) {
      ...
    }
  }
}

请参阅 watch docs 了解更多信息。


如果您想知道旧的和新的纬度和经度值,那么一种方法是观察子级中的 Position 属性,改变父级中的 Position 属性,并保持 { lat, lng } 对象不可变:

child

watch: {
  'vehicle.Position'(oldVal, newVal) {
    const oldLat = oldVal.lat
    const newLat = newVal.lat
  }
}

父级

// When you want to update the vehicle's position...
this.vehicle.Position = { lat: 123, lng: 456 }

关于vue.js - 观看 Prop 从 child 体内传递过来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551863/

相关文章:

vue.js - 模块构建失败(来自 ./node_modules/eslint-loader/index.js): Error: Cannot find module 'eslint/lib/formatters/stylish'

vue.js - 使用 vue-cli 和 vue-cli-service 是一种不好的做法吗?

javascript - 在 Vue.js 中,当按下回车键时,向文本输出添加一个 <br> 标签

vue.js - 格式化 Vuex 对象值的方法

javascript - 有条件地呈现结束标记以模拟日历行为

json - 从 Controller 读取 json 响应到 Axios Catch 部分 - Laravel Vue Axios

vue.js - vuejs vue-cli 如何使用console.log 而不会出现任何错误

vue.js - 具有 Auth0 身份验证的 VueJS 应用程序

javascript - Vue CLI 生成空正文,错误为 : Cannot find element: #app after migration vuecli 2>3

javascript - Vue.js2 渲染空数组