常见问题
项目启动报错
解决办法:查看 node
和 pnpm
版本 ( node
16.18.0 版本及以上、pnpm
6 版本及以上) 删除 node_modules
重新执行 pnpm install
命令
Access is denied
(windows
常见)
项目出现报错 解决办法:请遵循平台要求,安装对应的 node
和 pnpm
版本 ( node
16 版本及以上、pnpm
6 版本及以上)
cmd
中出现错误 Cannot assign to "xxx" because it is a constant
项目首次启动 声明对象时使用了 const
但是又更改了它的值,使用 let
代替它
Invalid watch source
项目警告 vue3
watch 函数必须监听的是 getter/effect function, a ref, a reactive object, or an array of these types
举个🌰
点击查看
<script setup>
import { watch } from 'vue'
const props = defineProps({
isCollapsed: {
type: Boolean,
default: false,
},
})
// 错误示例
watch(props.isCollapsed, () => {})
// 正确示例
watch(
() => props.isCollapsed,
() => {}
)
</script>
vue3
的 <script setup>
写法,虽然会依据它的文件名来自动推断组件名称 name
,但这也约束了我们的写法,不算灵活,如何解决?
unplugin-vue-define-options 可以在一个 setup
里加入 name
,很方便。用法如下
<script setup>
defineOptions({
name: 'ui-menu',
})
</script>
$ref
语法糖不起作用
警告
Vue 3.4 及以上版本中被移除,最新的前端框架中已弃用
响应性语法糖目前默认是关闭状态,需要你显式选择启用。。
官方解答 显式启用
$children
不存在怎么办?
可以在父组件中声明一个数组通过 provide
注入,在子组件中通过 inject
获取后,在 Onmounted
中 向数组中添加子组件中的方法或者属性,这样在父组件中就可以获取到子组件中的方法或者属性了。下面是一个🌰
ui-menu.vue
点击查看
<script setup>
import { reactive, provide } from 'vue'
let menuItemSlot = reactive([])
provide('UiMenu', reactive({ menuItemSlot }))
</script>
menu-item.vue
点击查看
<script setup>
import { inject, onMounted, reactive } from 'vue'
import { getUUID } from '@/utils/common'
defineOptions({
name: 'menu-item',
})
const props = defineProps({
name: {
required: true,
type: String,
},
})
let active = $ref(false)
const rootMenu = inject('UiMenu')
const id = getUUID()
function handleUpdateActiveName(name) {
if (props.name === name) {
active = true
} else {
active = false
}
}
onMounted(() => {
const menuItem = reactive({
id: id,
name: props.name,
handleUpdateActiveName,
})
rootMenu.menuItemSlot.push(menuItem)
})
</script>
createApp
方法创建的组件无法识别全局组件
通过 由于通过 createApp
创建的组件并不是在 APP 下进行渲染,无法使用 APP 下的环境(全局组件,全局指令,原型属性函数)
所以当需要用到其他组件等,需要再次引入
jsx
创建的组件样式不起作用
由于在 vue3
中带有 scoped
的 style 标签只能作用域 vue 文件。所以这里需要用到 CSS Modules
具体例子可参考 src/components/ui-confirm/index.vue
v-model
在 vue3
中的更改
见官方示例
404 路由必要性
如果没有对不存在的路由进行匹配,登录系统会有如下警告:
这是由于系统中的路由是由后端生成的,初始化未登录时还没有在路由列表中生成路由造成的,这时需要由一个 404 路由匹配
此时会有一个问题,登录系统后由于还未动态生成其他路由,系统会跳转到 404 路由,动态添加路由成功后未继续跳转真正需要跳转的路由,需要在 全局路由警卫
中跳转,以下为核心代码
点击查看
/**
* 由于路由是动态创建的,初次进入时还未载入,这时会进入到404页面中
* 路由动态添加完成后需要重新载入要进入的路由,
* 如果是重定向路由,从缓存的路由列表中找到需要重定向进入的路由
* 如果是指定路由则替换即可
*/
if (to.name === '/') {
const redirectRoute = accessRoutes.find((row) => row.name === '/')
next({
...redirectRoute,
replace: true,
})
} else {
next({
path: to.fullPath,
replace: true,
query: to.query,
})
}