如何在 vue 组合 api 中使用路由器?

Jon*_*Sud 9 vue.js vuejs2

我在 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)

  • 问题是针对 Vue 2 和composition-api 包 (3认同)

Анд*_*ока 7

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)


sma*_*ius 5

您可以将参数作为 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)

  • 他不是。他使用 `@vue/composition-api` 这是一个组合 API 作为 Vue 2 的插件 (3认同)
  • useRoute 在 vue 2 路由器中不可用。这对我不起作用。这是为 vue 3 设计的吗? (2认同)