在Vue.js或React等前端框架中,父组件和子组件之间的数据通信是一个常见的需求。如果父组件和子组件的数据表格ID不同,但需要实现选中状态的回显,可以通过以下步骤来实现:
父组件需要将选中的ID传递给子组件。可以通过props或事件来实现。
<template>
<div>
<ChildComponent :selectedIds="selectedIds" @update-selected="handleUpdateSelected" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
data() {
return {
selectedIds: [] // 父组件中的选中ID
};
},
methods: {
handleUpdateSelected(ids) {
this.selectedIds = ids;
}
}
};
</script>
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';
function ParentComponent() {
const [selectedIds, setSelectedIds] = useState([]);
const handleUpdateSelected = (ids) => {
setSelectedIds(ids);
};
return (
<div>
<ChildComponent selectedIds={selectedIds} onUpdateSelected={handleUpdateSelected} />
</div>
);
}
export default ParentComponent;
子组件需要接收父组件传递的选中状态,并根据这些状态来设置表格的选中状态。
<template>
<div>
<table>
<tr v-for="item in items" :key="item.id">
<td>
<input
type="checkbox"
:checked="isSelected(item.id)"
@change="handleCheckboxChange(item.id)"
/>
</td>
<td>{{ item.name }}</td>
</tr>
</table>
</div>
</template>
<script>
export default {
props: {
selectedIds: {
type: Array,
default: () => []
}
},
data() {
return {
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
]
};
},
methods: {
isSelected(id) {
return this.selectedIds.includes(id);
},
handleCheckboxChange(id) {
const selectedIds = [...this.selectedIds];
const index = selectedIds.indexOf(id);
if (index === -1) {
selectedIds.push(id);
} else {
selectedIds.splice(index, 1);
}
this.$emit('update-selected', selectedIds);
}
}
};
</script>
import React from 'react';
function ChildComponent({ selectedIds, onUpdateSelected }) {
const items = [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
];
const isSelected = (id) => selectedIds.includes(id);
const handleCheckboxChange = (id) => {
const newSelectedIds = selectedIds.includes(id)
? selectedIds.filter((selectedId) => selectedId !== id)
: [...selectedIds, id];
onUpdateSelected(newSelectedIds);
};
return (
<div>
<table>
<tbody>
{items.map((item) => (
<tr key={item.id}>
<td>
<input
type="checkbox"
checked={isSelected(item.id)}
onChange={() => handleCheckboxChange(item.id)}
/>
</td>
<td>{item.name}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default ChildComponent;
如果父组件和子组件的ID不同,可以在子组件中进行ID的映射或转换。例如,子组件可以维护一个映射表,将父组件的ID转换为子组件的ID。
<template>
<div>
<table>
<tr v-for="item in items" :key="item.id">
<td>
<input
type="checkbox"
:checked="isSelected(item.id)"
@change="handleCheckboxChange(item.id)"
/>
</td>
<td>{{ item.name }}</td>
</tr>
</table>
</div>
</template>
<script>
export default {
props: {
selectedIds: {
type: Array,
default: () => []
}
},
data() {
return {
items: [
{ id: 101, name: 'Item 1' },
{ id: 102, name: 'Item 2' },
{ id: 103, name: 'Item 3' }
],
idMapping: {
1: 101,
2: 102,
3: 103
}
};
},
methods: {
isSelected(id) {
const parentId = this.getParentId(id);
return this.selectedIds.includes(parentId);
},
handleCheckboxChange(id) {
const parentId = this.getParentId(id);
const selectedIds = [...this.selectedIds];
const index = selectedIds.indexOf(parentId);
if (index === -1) {
selectedIds.push(parentId);
} else {
selectedIds.splice(index, 1);
}
this.$emit('update-selected', selectedIds);
},
getParentId(childId) {
return Object.keys(this.idMapping).find(key => this.idMapping[key] === childId);
}
}
};
</script>
import React from 'react';
function ChildComponent({ selectedIds, onUpdateSelected }) {
const items = [
{ id: 101, name: 'Item 1' },
{ id: 102, name: 'Item 2' },
{ id: 103, name: 'Item 3' }
];
const idMapping = {
1: 101,
2: 102,
3: 103
};
const getParentId = (childId) => {
return Object.keys(idMapping).find((key) => idMapping[key] === childId);
};
const isSelected = (id) => {
const parentId = getParentId(id);
return selectedIds.includes(Number(parentId));
};
const handleCheckboxChange = (id) => {
const parentId = getParentId(id);
const newSelectedIds = selectedIds.includes(Number(parentId))
? selectedIds.filter((selectedId) => selectedId !== Number(parentId))
: [...selectedIds, Number(parentId)];
onUpdateSelected(newSelectedIds);
};
return (
<div>
<table>
<tbody>
{items.map((item) => (
<tr key={item.id}>
<td>
<input
type="checkbox"
checked={isSelected(item.id)}
onChange={() => handleCheckboxChange(item.id)}
/>
</td>
<td>{item.name}</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default ChildComponent;
通过上述步骤,你可以实现父组件和子组件之间选中状态的回显,即使它们的ID不同。关键在于通过props传递选中状态,并在子组件中进行ID的映射或转换。