Vue.js 如何通过共享url来共享vue组件状态?

Vue.js 如何通过共享url来共享vue组件状态?,vue.js,vue-component,vue-router,Vue.js,Vue Component,Vue Router,我的设置 我有一个显示数据表的组件 数据可以通过在字段中输入内容进行过滤,字段中的值存储在组件道具中 我还准备了vue路由器,用于在该组件和其他组件之间进行路由 我的愿望 我想通过为某个团队成员提供url,与他/她共享筛选表的状态 当url被访问时,道具从url中获得分配的值,瞧,我得到了相同的列表 并非每次都需要这些参数。因此,如果我只按其中一个字段进行筛选,我只需要将该参数传入url 我的问题 我该怎么做 我没有看到哪些陷阱 到目前为止我尝试了什么… …正在玩这个。$router

我的设置

  • 我有一个显示数据表的组件

  • 数据可以通过在字段中输入内容进行过滤,字段中的值存储在组件道具中

  • 我还准备了vue路由器,用于在该组件和其他组件之间进行路由

  • 我的愿望

  • 我想通过为某个团队成员提供url,与他/她共享筛选表的状态

  • 当url被访问时,道具从url中获得分配的值,瞧,我得到了相同的列表

  • 并非每次都需要这些参数。因此,如果我只按其中一个字段进行筛选,我只需要将该参数传入url

  • 我的问题

  • 我该怎么做
  • 我没有看到哪些陷阱
  • 到目前为止我尝试了什么…

    …正在玩
    这个。$router.push()
    函数,通过
    watch()
    改变道具;但我无法想象如何一方面避免重新加载页面,另一方面如何不调整服务器配置(因为我希望路由也能在没有任何参数的情况下工作)


    我也不知道如何在路由器配置中定义动态URL。。。如果每次都要传递一组不同的参数,有没有一种方法,或者为每个可能的配置创建别名?

    而不是像
    /path/:parameter\u 1/:parameter\u 2
    那样注册路由,您应该实际注册
    /path
    ,然后使用
    this.$router.push('/path?parameter\u 1=xxx¶meter\u 2=yyy'))

    这是从我的代码中摘录的-当页面/排序/rowsPerPage发生更改时,
    数据表
    组件将发出
    分页
    事件,在初始呈现时也是如此。由于我们只更改URL查询值(URL中
    之后的文本),Vue将重用该组件,因此我们在路由更新之前收听
    以对URL中的新参数作出反应,并获取适当的数据:

    数据()
    {
    返回{
    过滤器:
    {
    参数_1:this.$route.query.parameter_1 | |“”,
    参数_2:this.$route.query.parameter_2 | |“”,
    }
    }
    },
    观察:
    {
    过滤器:
    {
    深:是的,
    处理程序:“FilterationHasChanged”
    }
    },
    路由更新前(到、从、下一个)
    {
    这个。获取数据(到);
    next();
    },
    方法:
    {
    buildQuery(路由)
    {
    const query=route?route.query:this.$route.query;
    设params='?';
    if(query.parameter_1)params+='¶meter_1='+query.parameter_1;
    if(query.parameter_2)params+='¶meter_2='+query.parameter_2;
    返回参数;
    },
    获取数据(路由)
    {
    this.$ajax.get('/api_endpoint'+this.buildQuery(route))。然后(response=>
    {
    //使用API响应
    });
    },
    过滤已更改(过滤器)
    {
    const obj=Object.assign({},this.$route.query);
    if(过滤器参数_1)
    { 
    obj.parameter_1=filters.parameter_1;
    }
    其他的
    { 
    删除对象参数_1;
    }
    if(过滤器参数_2)
    { 
    obj.parameter_2=filters.parameter_2;
    }
    其他的
    { 
    删除obj.parameter_2;
    }
    //检查新旧查询是否相同-如果相同,VueRouter将不会更改路由,因此这可能是第一次加载页面
    if(this.isSameObject(查询,obj))
    { 
    this.fetchData();//页面已在浏览器中手动重新加载
    } 
    其他的
    {
    这是$router.replace({
    …此.$router.currentRoute,
    查询:obj
    });
    }
    },
    isSameObject(a,b)
    {
    让同样的假设成立;
    用于(a中的常量键)
    {
    如果(a[键]!=b[键])
    {
    相同=错误;
    打破
    }
    }
    //处理密钥存在于B中但不存在于a中的情况
    用于(b中的常量键)
    {
    如果(a[键]!=b[键])
    {
    相同=错误;
    打破
    }
    }
    返回相同的值;
    }
    }
    
    页面不会重新加载-Vue将重用组件实例并对其进行修补。您会注意到,通过
    beforeRouteUpdate
    hook触发而不是
    beforeRouteEnter
    hook触发的事实。对于您的用例,使用URL查询值而不是路由路径参数更合适。我最近需要一个可选的路由参数,并发现:)谢谢您的评论@ivo你能提供更多关于“URL查询值”的信息吗?谢谢。如果你想改进你的答案,可以摘录那些真正重要的部分,并注释掉你的具体部分,这样我们就可以为so社区创造一般知识了吗?@helle,当然可以。谢谢。什么是
    FilterationHasChanged
    ,它在哪里被调用?@helle它是一个简单的观察者,导航到新路线,然后用户更新过滤器。这对浏览器上的后退和前进按钮不起作用,因为url只会在顶部更改,但数据不会更改