用vue3写一套穿梭框传参值不一样
时间: 2023-07-28 18:47:16 浏览: 101
好的,针对您的问题,我可以为您提供以下的代码示例。
首先,在 Vue 3 中,我们可以使用 `defineComponent` 函数定义一个组件,并使用 `ref` 创建一个响应式对象。
在这个穿梭框组件中,我们需要传递两个参数:一个是源数据列表 `sourceData`,另一个是目标数据列表 `targetData`。我们可以使用 `props` 来定义这两个参数,并使用 `emit` 方法来触发事件,将选择的值传递给父组件。
以下是一个示例代码:
```html
<template>
<div>
<div>
<h2>Source List</h2>
<ul>
<li v-for="item in sourceData" :key="item.id">
<input type="checkbox" @change="handleChange(item, 'source')" :checked="item.checked"/>
{{item.name}}
</li>
</ul>
</div>
<div>
<h2>Target List</h2>
<ul>
<li v-for="item in targetData" :key="item.id">
<input type="checkbox" @change="handleChange(item, 'target')" :checked="item.checked"/>
{{item.name}}
</li>
</ul>
</div>
</div>
</template>
<script>
import { defineComponent, ref } from 'vue';
export default defineComponent({
props: {
sourceData: Array,
targetData: Array
},
emits: ['update:sourceData', 'update:targetData'],
setup(props, { emit }) {
const source = ref(props.sourceData);
const target = ref(props.targetData);
const handleChange = (item, type) => {
const list = type === 'source' ? source : target;
const updateEvent = type === 'source' ? 'update:sourceData' : 'update:targetData';
list.value = list.value.map((i) => {
if (i.id === item.id) {
return { ...i, checked: !i.checked };
}
return i;
});
emit(updateEvent, list.value.filter((i) => i.checked));
};
return {
source,
target,
handleChange
};
}
});
</script>
```
在上面的代码中,我们使用了 `ref` 创建了两个响应式对象 `source` 和 `target`,并通过 `props` 传递了源数据列表 `sourceData` 和目标数据列表 `targetData`。
在 `handleChange` 方法中,我们根据传入的参数 `type` 来决定是更新源数据列表还是目标数据列表,并通过 `emit` 方法触发 `update:sourceData` 或 `update:targetData` 事件,将选中的值传递给父组件。
在模板中,我们使用 `v-for` 指令遍历源数据列表和目标数据列表,并使用 `input` 元素的 `checked` 属性来判断是否选中。当用户选择了某一项时,我们会调用 `handleChange` 方法来更新响应式对象,并触发事件。
希望这个示例能够帮助您解决问题。
阅读全文