网站首页 > 博客文章 正文
最近在练习写管理后台的网页时,碰到一个问题 ,描述如下:
通过侧边栏点击对应的菜单,把对应选择的菜单信息传递到table组件,table组件中通过watch对选择的菜单数据进行监听,当出现变化时,对table进行更新,但是第一次点击时,table总是不更新,通过日志发现数据也变化了,但是watch中的代码并未执行。
以下时文心一言3.5给出的解决方案和解释:
原代码:第一次点击菜单时,watch中的api不执行,导致table数据不变化。
<script setup>
import { api } from '@/api/index'
import { ref, watch } from 'vue';
// 表格数据
const tableColumn = ref({'id': 'ID', 'username': '用户名', 'role_name': '角色', 'department_name': '部门'});
const tableData = ref([
{ name: '张三', age: 20, gender: '男' },
{ name: '李四', age: 25, gender: '女' },
{ name: '王五', age: 30, gender: '男' },
]);
const tableColumnObj = {
'用户管理': {'id': 'ID', 'username': '用户名', 'role_name': '角色', 'department_name': '部门'},
'角色管理': {'id': 'ID', 'role_name': '角色'},
'菜单管理': {'id': 'ID', 'menu_name': '菜单', 'parent_menu_name': '父菜单', 'menu_url': '菜单地址'},
'部门管理': {'id': 'ID', 'department_name': '部门'},
};
const props = defineProps({
selectedMenu: Object,
});
watch(()=>props.selectedMenu, (newValue, oldValue) => {
tableColumn.value = tableColumnObj[newValue.menu.menu_name]
api.getTableList(newValue.menu.menu_url).then(res => {
tableData.value = res.data;
});
});
</script>
以下是文心给的修改方案:
<script setup>
import { api } from '@/api/index'
import { ref, watch, onMounted } from 'vue';
// 表格数据
const tableColumn = ref({'id': 'ID', 'username': '用户名', 'role_name': '角色', 'department_name': '部门'});
const tableData = ref([
{ name: '张三', age: 20, gender: '男' },
{ name: '李四', age: 25, gender: '女' },
{ name: '王五', age: 30, gender: '男' },
]);
const tableColumnObj = {
'用户管理': {'id': 'ID', 'username': '用户名', 'role_name': '角色', 'department_name': '部门'},
'角色管理': {'id': 'ID', 'role_name': '角色'},
'菜单管理': {'id': 'ID', 'menu_name': '菜单', 'parent_menu_name': '父菜单', 'menu_url': '菜单地址'},
'部门管理': {'id': 'ID', 'department_name': '部门'},
};
const props = defineProps({
selectedMenu: Object,
});
const onSelectedMenuChange = (newValue, oldValue) => {
console.log('watch', newValue, oldValue);
tableColumn.value = tableColumnObj[newValue.menu.menu_name];
api.getTableList(newValue.menu.menu_url).then(res => {
tableData.value = res.data;
console.log('xx', res.data);
});
};
watch(() => props.selectedMenu, onSelectedMenuChange);
onMounted(() => {
onSelectedMenuChange(props.selectedMenu, undefined); // 传入当前值和 undefined 作为旧值
});
</script>
原因:在 Vue 3 的 Composition API 中,watch 函数默认不会在初始化时立即执行其回调函数,即它不会模拟 Options API 中 watch 的 immediate: true 行为。这是 watch 函数的设计决定的,它只会在其依赖的值发生变化时执行回调函数,所以通过用onMounted 在组件挂载后立即调用一次回调函数,达到immediate的效果。
猜你喜欢
- 2024-10-28 功能问题:如何解决跳同一路由组件时页面不变?
- 2024-10-28 Vue3.0来龙去脉更新历程(vue3最新版本)
- 2024-10-28 vue3移除了$on,$off ,$once(vue 移除list中的项)
- 2024-10-28 图解 Vue 异步更新原理(vuex异步)
- 2024-10-28 VUE又要更新了,这框架真这么难学吗?
- 2024-10-28 Vue 3.3.6 发布了,得益于WeakMap,它更快了
- 2024-10-28 新闻在线全栈开发实战(vue3+springboot)之五-数据库信息的更新
- 2024-10-28 vue引入element-ui后界面空白(vue引入elementui不起作用)
- 2024-10-28 VUE3前端开发入门系列教程三:VITE热更新配置及WSL填坑
- 2024-10-28 vue3使用vuex 集中式管理状态数据
你 发表评论:
欢迎- 06-23MySQL合集-mysql5.7及mysql8的一些特性
- 06-23MySQL CREATE TABLE 简单设计模板交流
- 06-23MYSQL表设计规范(mysql设计表注意事项)
- 06-23MySQL数据库入门(四)数据类型简介
- 06-23数据丢失?别慌!MySQL备份恢复攻略
- 06-23MySQL设计规范(mysql 设计)
- 06-23MySQL数据实时增量同步到Elasticsearch
- 06-23MySQL 避坑指南之隐式数据类型转换
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)