使用Vue-Router

时间:2019-12-12 21:20:50

标签: javascript vue.js vue-router nuxt.js

我正在尝试将数据对象的查询字符串附加到URL,然后根据查询从服务器获取一些数据。

添加查询字符串和通过更改数据删除查询字符串是可行的,我似乎无法弄清楚的唯一事情就是如何通过使用vue-router返回页面来更改数据。

也许要提一下

beforeRouteEnter(to, from, next) {
   this.query = to.query
   next()
}

既有效,又会触发设置查询字符串的观察程序。

这是我到目前为止所得到的,有人可以指出正确的方向吗?

<template>
  <div>
    <div class="form-group">
      <label for="">String</label>
      <input
        type="text"
        class="form-control"
        v-model="query.string"
        placeholder="string"
      >
    </div>
    <div class="form-check form-check-inline">
      <label class="form-check-label">
        <input
          class="form-check-input"
          type="checkbox"
          v-model="query.boolean"
        > Boolean
      </label>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      query: {
        string: this.$route.query.string || "",
        array: this.$route.query.array
          ? this.$route.query.array.split(",")
          : [],
        boolean: this.$route.query.boolean || false
      }
    };
  },
  watch: {
    query: {
      deep: true,
      handler(newFilters) {
        const q = this.toQuerystring({
          ...this.query
        });
        const path = `${this.$route.path}?${q}`;
        this.$router.push(path);
      }
    }
  },
  methods: {
    toQuerystring(object, parentNode = null) {
      let query = Object.entries(object)
        .map(item => {
          let key = parentNode ? `${parentNode}[${item[0]}]` : item[0];
          let value = item[1];
          if (Array.isArray(value)) {
            if (value.length > 0) {
              value = value.map(encodeURIComponent);
              return key + "=" + value.join(",");
            } else {
              return "";
            }
          } else if (value instanceof Object) {
            return toQuerystring(value, key);
          } else if (item[1] !== null && item[1] !== "" && item[1] !== false) {
            return [
              Array.isArray(item[0]) ? `${key}` : key,
              encodeURIComponent(item[1])
            ].join("=");
          }
          return "";
        })
        .filter(empty => empty)
        .join("&");
      return "?" + query;
    }
  }
};
</script>

0 个答案:

没有答案
相关问题