BS1*_*100 3 javascript data-visualization vue.js
我在VUE中有一个概念相关的。
我对如何将数据传递给子 vue 文件有点困惑。(vue 实例?老实说不熟悉这个术语)
在某些情况下,当数据通过'props'传递时,子vue文件中的数据更改不会更改父文件的数据。
另一方面,子vue文件中的数据变化,实际上是改变了父母的数据。
我刚刚遇到了情况2.这是数据通过eventbus传递的时候。
我可以理解这种性质如下吗?
“仅当数据通过 eventbus 传递时,数据才作为参考传递”
尽管,
“当数据通过道具传递时,数据作为单独的副本传递给孩子,孩子的变化不会改变父母的原始数据”
可以顺便看看Vue的性质吗?如果有人能给我一个例子,孩子的变化不会影响父母的数据,我将不胜感激。
每次我问与 Vue 相关的问题时,总是感到非常内疚,因为代码与 Javascript 的问题非常不同。先感谢您。
我刚刚遇到的例子如下。
=main.js=
import Vue from 'vue'
import App from './App.vue'
export const serverBus = new Vue()
new Vue({
el: '#app',
render: h => h(App)
})
Run Code Online (Sandbox Code Playgroud)
=Servers.vue=
<template>
<div class="col-xs-12 col-sm-6">
<ul class="list-group">
<Server v-for='server in serverinfo' :serverinfo='server' :key='server.id'></Server>
</ul>
</div>
</template>
<script>
import Server from './server.vue'
export default {
components: {
Server
},
data() {
return {
serverinfo: [
{id:1, servno:'#1', servstat:'normal'},
{id:2, servno:'#2', servstat:'critical'},
{id:3, servno:'#3', servstat:'unknown'},
{id:4, servno:'#4', servstat:'error'},
{id:5, servno:'#5', servstat:'excellent'}]
}
}
}
</script>
<style>
</style>
Run Code Online (Sandbox Code Playgroud)
=server.vue=
<template>
<li class='list-group-item' @click='serverselected'>
Server {{serverinfo.servno}}
</li>
</template>
<script>
import {serverBus} from '../../main.js'
export default {
props:['serverinfo'],
methods:{
serverselected(){
serverBus.$emit('serverselected', this.serverinfo)
}
}
}
</script>
<style>
</style>
Run Code Online (Sandbox Code Playgroud)
=ServerDetails.vue=
<template>
<div class="col-xs-12 col-sm-6">
<p v-if='!server'>Please Select a server</p>
<p v-else>Server {{server.servno}} is selected. Status:{{server.servstat}}</p>
<button class="btn btn-primary" @click='backtonormal'>Back to Normal</button>
</div>
</template>
<script>
import {serverBus} from '../../main.js'
export default{
methods:{
backtonormal(){
this.server.servstat='normal'
}
},
data(){
return{
server:null
}
},
created(){
serverBus.$on('serverselected',(server)=>{
this.server=server
})
}
}
</script>
<style>
</style>
Run Code Online (Sandbox Code Playgroud)
当您通过 props 传递对象时,Vue 不会复制。如果你通过 prop 传递一个对象,那么两个组件都会看到同一个对象。由于它是同一个对象,子项所做的任何属性更改也会影响另一个父项。
查看有关单向数据流的文档:
https://vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow
开头的段落有点误导,可能会让您相信是复制的。它专门讨论为道具分配新值,但措辞含糊不清。然而,事实并非如此,关键句在最后:
请注意,JavaScript 中的对象和数组是通过引用传递的,因此如果 prop 是数组或对象,在子组件内改变对象或数组本身将影响父状态。
我不知道不复印的官方原因是什么,但一些可能的原因是:
至于你关于发射的问题...
发出更改事件是单向数据流和数据所有权的一部分。这个想法是只有数据的所有者才能修改它。其目的是使推理和调试问题更容易。
实际上,正如您所描述的那样,没有什么可以阻止孩子直接修改对象。您需要自己决定什么最有利于代码的可维护性。
一个问题是孩子与父母耦合。只有当该对象是该数据的最终真实来源时,才能修改子对象中的对象。例如,如果对象是使用计算属性在父对象中创建的,那么修改它就不起作用。通过使用,$emit我们将责任传递给数据所有者,以决定进行所需更改的正确方法。
| 归档时间: |
|
| 查看次数: |
1955 次 |
| 最近记录: |