回答:不一定,如果是基本数据类型,通过props传递的变量,数据是单向传递。如果是引用数据类型,如一个Object对象,则子组件修改值,不需要额外逻辑,也会影响到父组件的值。
- 通过props传递基本数据类型,数据则单向传递。如下代码,父子组件通过props传递remarks变量值,remarks为String基本数据类型变量,数据则单向传递。
------------------------父组件--------------------------------
<script setup>
import {reactive} from "vue";
import SonItem from "./SonItem.vue";
let formModel = reactive({
remarks: 'Hello'
})
</script>
<template>
<div >
<p>{{formModel}}</p>
<SonItem :remarks="formModel.remarks" />
</div>
</template>
-----------------------子组件-----------------------------------
<template>
<input type="text" v-model="props.remarks" >
</template>
<script setup>
let props = defineProps({
remarks:{
type: String
}
});
</script>
- 通过props传递引用类型Object,数据则相互影响,非单向传递。如下代码,父子组件通过props传递remarks变量值,remarks为String基本数据类型变量,数据则单向传递。
------------------------父组件--------------------------------
<script setup>
import {reactive} from "vue";
import SonItem from "./SonItem.vue";
let formModel = reactive({
itemType: {
name: 'Fruit'
}
})
</script>
<template>
<div >
<p>{{formModel}}</p>
<SonItem :item-type="formModel.itemType" />
</div>
</template>
-----------------------子组件-----------------------------------
<template>
<input type="text" v-model="props.itemType.name" >
</template>
<script setup>
let props = defineProps({
itemType:{
type: Object
}
});
</script>
拓展
- js的基本数据类型有
- Null,只有一个值null,概念上指没有任何对象。
- Undefined,只有一个值undefined,概念上指没有值。
- Boolean,有两个值true和false。
- Number
- BigInt,表示任意大小的整数。
- String,文本数据。
- Symbol,创建全局唯一值,具有唯一性,全局定义唯一;不可性,一旦创建,不可修改;私有性,Symbol类型的键,不能通过for … in等遍历获取。
- js的引用类型为 Object类型。
- Symbol 类型的使用场景,
- 定义对外不暴露的键值,如不希望外部通过Object.keys()方法获取键值,或者,for…in遍历时,用Symbol命名键。
- 代替常量定义。
- 定义类中私有属性。
- 通过Symbol.for()注册或获取一个全局实例。
- 自定义迭代器。Symbol.iterator指代对象的迭代器,实现自定义迭代器的生成器函数。
示例代码如下
const ID_NUMBER = Symbol('id number'); //可接受参数
const SET_NUMBER = Symbol();
class Person {
constructor(name, idNumber) {
this.name = name;
this[ID_NUMBER] = idNumber; //定义私有属性,外部通过Object.keys()获取到Person类实例的键只有name
this[SET_NUMBER] = function(ideNumber){ //定义私有方法,其他js包无法调用该方法
this[ID_NUMBER] = ideNumber
}
}
getIdNumber(){
return this[ID_NUMBER]; //外部js,只能通过公共方法,访问私有变量
}
}
- 当引用传递时,在子组件中,通过深拷贝的方式,可以切断父子组件中值的相互影响。例如
let itemCopy = JSON.parse(JSON.stringify(props.itemType))