element tabs标签页有2个常用的事件方法,tab-click 和 tab-change
tab-click事件
tab-click事件:当用户点击Tab标签时触发,有2个返回参数, (pane: TabsPaneContext, ev: Event)
pane.props.name 中可以获取到最新的tab页签绑定值
注意:很多人在平常使用的时候并不会从 pane.props.name 中去获取最新tab页签绑定值, 会直接使用之前的activeName作为最新值
问题复现(错误用法):
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="User" name="first">User</el-tab-pane>
<el-tab-pane label="Config" name="second">Config</el-tab-pane>
<el-tab-pane label="Role" name="third">Role</el-tab-pane>
<el-tab-pane label="Task" name="fourth">Task</el-tab-pane>
</el-tabs>
const activeName = ref('first')
//模拟点击了 Config 这个标签
const handleClick = (tab: TabsPaneContext, event: Event) => {
//不从 tab返回值中获取最新的tab值
//直接使用 activeName 来查询最新数据
// 这个时候的 activeName.value 值并没有更新,还是 first
console.log("activeName", activeName.value); // 'first'
// 会造成无法拿到最新的 绑定值
getTableData()
}
//标签切换 执行重新获取数据接口
const getTableData = ()=>{
const params = { tabs: activeName.value }
getTable().then(res =>{
console.log('最新数据', res)
})
}
解决方案:
//其余代码省略...
const activeName = ref('first')
//模拟点击了 Config 这个标签
const handleClick = (tab: TabsPaneContext, event: Event) => {
//方法一: 重新赋值
const { name } = tab.props;
activeName.value = name
console.log("name", name); // 'second'
getTableData()
//方法二: 数据更新后,执行方法
nextTick(() => {
console.log("activeName", activeName.value); // 'second'
getTableData()
});
//方法三: 使用setTimeout定时器
setTimeout(() => {
console.log("activeName", state.activeName); // 'second'
getTableData()
}, 200);
}
tab-change事件
tab-change事件:当Tab标签页的切换完成时触发,有1个返回参数, (name: TabPaneName)
可以直接拿到最新的绑定值
//其余代码省略...
const activeName = ref('first')
//模拟点击了 Config 这个标签
const handleClick = (name: TabPaneName) => {
console.log('name', name) // 'second'
console.log('activeName ', activeName.value) // 'second'
}