我在 vue 中定义了一个路由:
/users/:userId
Run Code Online (Sandbox Code Playgroud)
哪个指向 UserComponent:
<template>
<div>{{username}}</div>
</template>
Run Code Online (Sandbox Code Playgroud)
我使用computedfrom@vue/composition-api来获取数据。
问题是当路由更改为另一个时userId,通过导航到另一个用户,html 模板中的用户没有像我预期的那样更改。当用户不在列表中时,它也不会重定向。
那么我能做些什么来解决这个问题?
这是我的代码:
<template>
<div>{{username}}</div>
</template>
<script lang="ts">
import { computed, defineComponent, ref, getCurrentInstance } from '@vue/composition-api';
export const useUsername = ({ user }) => {
return { username: user.name };
};
export default defineComponent({
setup(props, { root }) {
const vm = getCurrentInstance();
const userToLoad = computed(() => root.$route.params.userId);
const listOfUsers = [
{ userId: 1, name: 'user1' },
{ userId: 2, name: 'user2' },
];
const user = listOfUsers.find((u) => u.userId === +userToLoad.value);
if (!user) {
return root.$router.push('/404');
}
const { username } = useUsername({ user });
return { username };
},
});
</script>
Run Code Online (Sandbox Code Playgroud)
ndo*_*tie 15
从vue-router文档中:
import { useRouter, useRoute } from 'vue-router'
export default {
setup() {
const router = useRouter()
const route = useRoute()
function pushWithQuery(query) {
if (!user) {
router.push({
name: '404',
query: {
...route.query
}
})
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
A也有同样的问题。我使用 vue 2 和 @vue/composition-api
我的决心:
创建:src/router/migrateRouterVue3.js
import { reactive } from '@vue/composition-api';
import router from './index';
const currentRoute = reactive({
...router.currentRoute,
});
router.beforeEach((to, from, next) => {
Object.keys(to).forEach(key => {
currentRoute[key] = to[key];
});
next();
});
// eslint-disable-next-line import/prefer-default-export
export function useRoute() {
return currentRoute;
}
Run Code Online (Sandbox Code Playgroud)
之后,我可以使用:
// import { useRoute } from 'vue-router';
import { useRoute } from '@/router/migrateRouterVue3';
Run Code Online (Sandbox Code Playgroud)
给您的解决方案:
// replace:
// const userToLoad = computed(() => root.$route.params.userId);
// to:
import { useRoute } from '@/router/migrateRouterVue3';
//...
const route = useRoute();
const userToLoad = computed(() => route.params.userId);
Run Code Online (Sandbox Code Playgroud)
您可以将参数作为 props 传递给您的组件。默认情况下,道具是反应性的。
路由配置如下所示:
{
path: '/users/:userId',
name: Users,
component: YourComponent
},
Run Code Online (Sandbox Code Playgroud)
然后您可以在组件中使用这些 propswatchEffect()
<template>
<div>{{username}}</div>
</template>
<script lang="ts">
import { computed, defineComponent, ref, getCurrentInstance, watchEffect } from '@vue/composition-api';
export const useUsername = ({ user }) => {
return { username: user.name };
};
export default defineComponent({
props: {userId: {type: String, required: true },
setup(props, { root }) {
const vm = getCurrentInstance();
const user = ref()
const userToLoad = computed(() => props.userId);
const listOfUsers = [
{ userId: 1, name: 'user1' },
{ userId: 2, name: 'user2' },
];
watchEffect(() => user.value = listOfUsers.find((u) => u.userId === +userToLoad.value))
if (!user) {
return root.$router.push('/404');
}
const { username } = useUsername({ user });
return { username };
},
});
</script>
Run Code Online (Sandbox Code Playgroud)
watchEffect()将在定义时以及反应式依赖项更改时立即运行
小智 5
你可以这样做:
import { useRoute } from 'vue-router';
export default {
setup() {
const route = useRoute();
// Now you can access params like:
console.log(route.params.id);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9300 次 |
| 最近记录: |