面试题答案
一键面试在Svelte中通过Props进行父子组件通信
- 父组件传递数据:在父组件中,通过在子组件标签上以属性的形式传递数据。例如:
<script>
import ChildComponent from './ChildComponent.svelte';
const myData = { name: 'John', age: 30 };
</script>
<ChildComponent {myData} />
- 子组件接收数据:在子组件中,使用
export let
语句来声明接收的props。例如:
<script>
export let myData;
</script>
<p>Name: {myData.name}, Age: {myData.age}</p>
接收和使用复杂对象作为Prop
- 正确接收:如上述例子,使用
export let
声明对象类型的prop。 - 正确使用:在子组件中可以直接访问对象的属性,就像
{myData.name}
这样来显示数据,或者在逻辑中使用这些属性。
可能遇到的问题及解决方法
- 问题:对象引用问题。如果子组件意外修改了传递过来的对象,可能会影响到父组件中的数据状态,因为Svelte传递对象是按引用传递。例如:
<!-- 子组件 -->
<script>
export let myData;
function modifyData() {
myData.age = 31;
}
</script>
<button on:click={modifyData}>Modify Data</button>
这样会改变父组件中myData
对象的age
属性。
2. 解决方法:
- 浅拷贝:在子组件中接收时进行浅拷贝。例如:
<script>
export let myData;
let localData = {...myData };
function modifyData() {
localData.age = 31;
}
</script>
这样修改localData
不会影响父组件的myData
。
- 不可变数据更新:使用immer等库来处理不可变数据更新,确保不会直接修改原始对象。例如:
<script>
import produce from 'immer';
export let myData;
function modifyData() {
myData = produce(myData, draft => {
draft.age = 31;
});
}
</script>
这样虽然看起来是修改了myData
,但实际上是创建了一个新的对象,并且Svelte能检测到这种变化并更新视图。