如何使用 vue.js 将多个带有键的值传递给 url

Posted

技术标签:

【中文标题】如何使用 vue.js 将多个带有键的值传递给 url【英文标题】:How to pass multiple value with key to url using vue.js 【发布时间】:2021-03-06 08:43:36 【问题描述】:

我有这个属性数据

        for(var k = 0;k<this.form.fields.length;k++)
                    
       
                        this.dynamic_fields.push(attribute_id:attributes[k].id,value: attributes[k].value)
                      
                    

this.$router.push( 
    path: '/api/search-temp',
    query:
        attributes: this.encodedAttributes()                     
    
);

    encodedAttributes() 
    const queryAttributes =this.dynamic_fields;
    if (queryAttributes) 
        return typeof queryAttributes !== "string"
            ? btoa(JSON.stringify(queryAttributes))
            : queryAttributes;
    
    return "";
,

我有一个属性 id 和一个属性值,所以我想将此 id 和值传递给 url,以便我在控制器属性数组中循环并获取 id 和值:

localhost:8000..?attributes[]['attribute_id_1']=attributevalue1&attributes[]['attribute_id_2']=attributevalue2...

我是这样重定向的:

 this.$router.push( path: '/search-list',query:
                    

                     
                    

问题是我想将此多维数组传递给 url,对此的任何其他解决方法也非常感谢

【问题讨论】:

【参考方案1】:

您可以尝试在将对象传递给 $route 查询之前对对象进行 json 字符串化和编码

function encodedAttributes() 
    const queryAttributes = this.$route.query.attributes;
    if (queryAttributes) 
        return typeof queryAttributes !== "string"
            ? btoa(JSON.stringify(this.$route.query.attributes))
            : queryAttributes;
    
    return "";


function decodedAttributes() 
    const attributes = this.$route.query.attributes;
    if (typeof attributes === "string" && attributes.length) 
        return JSON.parse(atob(attributes));
     else 
        return attributes;
            


并作为查询参数传递给路由

this.$router.push( 
    path: '/search-list',
    query:
        attributes: this.encodedAttributes()                     
    

然后在Controller中你可以解码请求数据中的属性值来获取关联数组

class MyController extends Controller

    public function index(Request $request)
    
        $request->attributes = is_array(
            $requestAttributes = json_decode(base64_decode($request->attributes), true)
        ) 
            ? $requestAttributes 
            : [];
        
        //Do other processing as needed
    

在我的一个项目中使用了类似的东西,现在无法获得代码。

如果需要,您可能可以使用函数来转义 encodedAttributesdecodedAttributes 中的 unicode 字符

function escapeUnicode(str)
    return str.replace(/[^\0-~]/g, c => '\\u' + ('000' + c.charCodeAt().toString(16)).slice(-4))


function encodedAttributes() 
    const queryAttributes = this.$route.query.attributes;
    if (queryAttributes) 
        return typeof queryAttributes !== "string"
            ? btoa(escapeUnicode(JSON.stringify(this.$route.query.attributes)))
            : queryAttributes;
    
    return "";



function decodedAttributes() 
    const attributes = this.$route.query.attributes;
    if (typeof attributes === "string" && attributes.length) 
        return JSON.parse(atob(escapeUnicode(attributes)));
     else 
        return attributes;
            

【讨论】:

谢谢,你能否在答案中指定我将如何以及以何种格式将数据传递给 this.$route.query.attributes 这就是我在答案中显示的属性可以是 vue 组件中的普通 javascript 对象。我们正在做的是将属性对象转换为 JSON 字符串,然后在将其推送到 this.$route 之前对其进行编码 可以在Vue组件的data函数或者方法中初始化attributes。然后可以修改encodedAttributes的签名为function encodedAttributes(attributes = null) const queryAttributes = attributes ? attributes || this.$route.query.attributes; //rest of the function declaration 我试过了,但是得到了这样的 url 属性 =W3siYXR0cmlidXRlX2lkIjozLCJhdHRyaWJ1dGVfbmFtZSI6IlNlYXRzIiwidmFsdWUiOiI2In0seyJhdHRyaWJ1dGVfaWQiOjQsImF0dHJpYnV0ZV9uYW1lIjoiQ29sb3IiLCJ2YWx1ZSI6Ik90aGVyIn1d,但没有得到属性,我在我的问题中编辑了我的代码,你可以检查一下代码中的问题 是的,它是一个编码字符串,您可以在 Laravel 控制器中轻松解码。那么问题是什么 - 该网址有一些看起来令人讨厌的编码字符串。没关系,实际上从安全的角度来看它可能更可取【参考方案2】:

您正在尝试将嵌套对象设置为查询参数,这是不可能的...您的路由查询对象必须是平面对象。

总结您拥有这样的东西的唯一方法:

?attributes[]['attribute_id_1']=attributevalue1&attributes[]['attribute_id_2']=attributevalue2

将来自这样的查询对象:

query: 
  "attributes[]['attribute_id_1']": 'attributevalue1',
  "attributes[]['attribute_id_2']": 'attributevalue2',

您应该将此多维数组展平为一个简单对象并将其用作您的查询对象。

这是一个例子... 从此:

const multiDimArr = [
  ['attribute_1', 'value1'],
  ['attribute_2', 'value2']
];

进入:

const myObject = 
  attribute_1: 'value1',
  attribute_2: 'value2'

这样做的方法是:

const multiDimArr = [
  ['attribute_1', 'value1'],
  ['attribute_2', 'value2']
];

const myObject = ;

multiDimArr.forEach(arr => 
  myObject[arr[0]] = arr[1];
);

然后使用该对象作为查询对象,这样你的url就会是这样的:

?attribute_1=value1&attribute_2=value2

【讨论】:

以上是关于如何使用 vue.js 将多个带有键的值传递给 url的主要内容,如果未能解决你的问题,请参考以下文章

如何将初始表单值传递给 Vue.js 中的子组件?

将数据 json 字符串传递给数字 Vue.js

Vue.js - 将多个道具传递给 V-For 中的子级

如何将相同的事件侦听器分配给 Vue.js 中动态创建的按钮并将对象的值作为参数传递给它?

Vue.js“超出最大调用堆栈大小”错误。将数据从父母传递给孩子失败

将 PHP 变量传递给 vue.js vue 组件