javascript - 使用 beforeEnter 传递数据以路由组件

标签 javascript vue.js vuejs2 vue-component vue-router

我将如何使用 beforeEnter 调用函数将数据传递给相应的路由组件?
在这种情况下, beforeEnter 的目的是确认有效的不记名 token 作为 cookie 存在。
目前,我有 beforeEnter/verify/auth 上点击 aws api 网关, 然后组件加载并调用 /list/repos 上的 dynamodb .问题是,两条路由都受到内置 AWS api gatewayV2 JWT 授权器的保护,因此点击 /verify/auth 毫无意义.
我想做的是beforeEnter点击/list/repos ,利用内置的 JWT 授权器,并使用从 api 调用获得的数据加载下一页。如果用户未正确验证,beforeEnter不会将用户发送到该路线。
所以:

  • api调用->加载页面

  • 而不是
  • api调用->加载页面->api调用

  • 这是我的代码。我在这里查看了一个类似的问题,但无法弄清楚。 passing data to route's component beforeEnter
    index.js
    let repositories = [];
    
    async function listRepositories(to, from, next) {
      var isAuthenticated = false;
      console.log("testing listRepositories...");
      if (Vue.$cookies.get("Authorization")) {
        try {
          const response = await fetch(
            process.env.VUE_APP_API_GATEWAY_ENDPOINT + "/list/repos",
            {
              method: "POST",
              body: '{"repo_owner": "sean"}',
              headers: {
                Authorization: Vue.$cookies.get("Authorization")
              }
            }
          );
          repositories = await response.json();
          console.log(repositories);
          if (repositories.message != "Unauthorized") {
            isAuthenticated = true;
            // return {
            //   repositories
            // };
            next();
          }
        } catch (error) {
          console.error(error);
        }
      }
      if (!isAuthenticated) {
        console.log("error not authenticated");
        to("/");
      }
    }
    
    const routes = [
      {
        path: "/",
        name: "Login",
        component: () => import("../views/Login.vue")
      },
      {
        path: "/repos",
        name: "Repos",
        // beforeEnter: isAuthenticated,
        beforeEnter: listRepositories,
        props: repositories => {
          {
            repositories;
          }
        },
        component: () => import("../views/Repos.vue")
      }
    ];
    
    ./views/Repos.vue
    <template>
      <div id="app" class="small-container">
        <repo-table
          :repositories="repositories"
        />
      </div>
    </template>
    
    <script>
    import RepoTable from "@/components/RepoTable.vue";
    
    export default {
      name: "Home",
      components: {
        RepoTable
      },
      data() {
        return {};
      },
      props: {
        repositories: {
          type: Array
        }
      }
    </script>
    
    ./components/RepoTable.vue
    <template>
      <div id="repository-table">
        <table border="0">
          <tr>
            <th style="text-align:left">Repository</th>
            // omitted for brevity
          </tr>
          <tbody>
            <tr v-for="(repo, index) in repositories" :key="repo.repo_name">
              <td>
                <b>{{ repo.repo_name }}</b>
                // omitted for brevity
              </td>
            </tr>
          </tbody>
        </table>
      </div>
    </template>
    
    <script>
    export default {
      name: "repository-table",
      data() {
        return {
          // repositories: []
        };
      },
      props: {
        repositories: {
          type: Array
        }
      },
    

    最佳答案

    使用带有 beforeEnter 的路由参数
    您可以从 beforeEnter 传递数据使用路由参数。当 props 的值是 true , 路由参数将被转换为 Prop :

    props: true
    
    现在你只需要一个名为 repositories 的参数它将作为 Prop 传递到目的地。在您的 beforeEnter ,当用户通过身份验证时,您可以添加该参数:
    if (repositories.message != "Unauthorized") {
      isAuthenticated = true;
      to.params.repositories = repositories;  // ✅ Adding the data to the param
      next();
    }
    
    其他修复:
  • 更改to('/')next('/')
  • 添加 next在每个逻辑路径中,例如,当有错误时,if条件满足。
  • 每次调用next调用 return喜欢 return next

  • 另外的选择:
    您也可以使用 beforeRouteEnter 来实现此目的。组件内防护。

    关于javascript - 使用 beforeEnter 传递数据以路由组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65865585/

    相关文章:

    html - CSS nth-child 仅来自具有类的元素

    javascript - 如何将不同的位置放在随机添加的图像上? Vue.js

    forms - Vuelidate 未正确验证表单数据

    javascript - 如何使用 Lodash 或纯 javascript 使用动态过滤器过滤嵌套对象?

    javascript - 在 while 循环中使用 ajax 调用 url

    javascript - 使用node.js意外的 token 输出json文件

    javascript - 等到 firebase 完成加载数据(vue)/'await' 不工作

    javascript - 在javascript文件中获取jsp值

    vue.js - 无法在 amazon-cognito 中捕获用户处理程序的成功/失败事件

    javascript - 匿名访问如何跟踪?智威汤逊/ cookies / session ?