如何将数据(json)传递给vue实例

Posted

技术标签:

【中文标题】如何将数据(json)传递给vue实例【英文标题】:How to pass data(json) to vue instance 【发布时间】:2017-04-17 10:31:40 【问题描述】:

我有一个简单的 Vue 实例,想在没有 HTTP 请求的情况下将 json 从后端传递给 vue,因为它总是一样的。

我试过用道具来做这个,但它不起作用...... 在 DOM 中,它看起来像 <div id="my-component" prices="[object Object]"> Vue调试工具将图像显示为空字符串,并在控制台undefined

<div id="my-component" :prices=" $prices ">
</div>

<script>
        new Vue(
            el: '#my-component',
            props: ['prices'],
            mounted: function() 
               console.log(this.image);
           ,
       );
</script> 

其中$prices json 编码数组。

【问题讨论】:

【参考方案1】:

虽然这个操作很旧,但我会这样做(灵感来自我在 Symfony 4 + VueJS 中的做法):

<div id="my-component" prices-data=" json($prices) ">
</div>

<script>
        new Vue(
            el: '#my-component',
            props: ['pricesData'],
            data: 
               prices: null,
            ,
            mounted: function() 
               this.prices = JSON.parse(this.pricesData);
           ,
       );
</script> 

这显然是假设 $prices 是刀片变量。

注意:当 $prices 是一个可以用 json_encode() 编码的简单对象时,我在上面使用了@json()(调用刀片 json 函数时会使用底层函数。如果对象很复杂,请考虑使用 @987654321如果对象变得过于复杂,则 @ 带有 @MaxDepth 注释。

【讨论】:

【参考方案2】:

我首先投票赞成this answer,但我必须改变我的投票(不能这样做实际上没有足够的声誉......)。

请不要这样设置数据,因为它会触发这样的错误: [Vue warn]: You may have an infinite update loop in a component render function

如果有任何东西会使用你以这种方式设置的数据(观察,基于它渲染组件)你将有一个无限循环。

当你使用这个方法时:

    您在渲染函数中设置数据(在模板中) 如果有什么东西触发了重新渲染,数据将被重新设置 使用此数据的任何内容都必须重新渲染,这可能会导致 在主 vue 实例上重新渲染

这将导致无限循环。

LinusBorg 有解释here.

【讨论】:

【参考方案3】:

您的解决方案几乎就在那里,但您不需要道具,而是使用数据属性并通过方法分配 JSON:

new Vue(
    el: '#app',
    data: 
        json: ,
    ,
    methods: 
    	setJson (payload) 
        	this.json = payload
        ,
    
)
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<div id="app" :json="setJson( foo: 'bar' )">
    <pre> json </pre>
</div>

您只需将 Laravel 数据分配给 setJson 方法负载,即

:json="setJson( $prices )

【讨论】:

太棒了,这就是我要找的!【参考方案4】:

我不知道是否有任何 Laravel 助手可以解决这个问题,但我会介绍一个通用的方法。

一种选择是将您的 JSON 数据存储在全局变量中,然后加载页面,然后在您的 js 文件中使用它。

基本上你需要生成一些类似的html

<script>
window.myApp = window.myApp || ;
window.myApp.userData =  "firstName": "John", "lastName": "Doe" ;
</script>

然后,您应该能够从 javascript 访问 myApp.userData 变量并在初始化 Vue 组件时使用它。

new Vue(
    el: '#app',
    data: 
        userData: myApp.userData
    
);

这是一个例子:

new Vue(
  el: '#app',
  data: 
    userData: myApp.userData
  
);
<script>
  window.myApp = window.myApp || ;
  window.myApp.userData =  "firstName": "John", "lastName": "Doe" ;
</script>


<div id="app">
  Hello userData.firstName
</div>

<script src="https://unpkg.com/vue/dist/vue.js"></script>

【讨论】:

是的,这是可行的方法。但它可以在没有额外变量的情况下完成吗?使用一些绑定或类似的东西? 这个想法是您需要在页面的某处公开该信息。这可以在变量、数据属性等上完成。使用这样的变量(在命名空间中)可以随着应用程序的增长而轻松推理。 是的,我理解这个想法。我问过原生的vue方式。如果没有办法以更清晰的方式做到这一点,我会这样做。

以上是关于如何将数据(json)传递给vue实例的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Vue 实例传递给嵌套组件

将刀片文件中的数据直接传递给 Vue 实例

Laravel 将 json 传递给 vue.js

如何将 websocket 实例传递给 vue.js 组件,然后在其上调用 send()?

如何将数据从 Vue 实例传递到 Vue.component?

如何在 Vue.js 中将实例化的 Vue 组件作为道具传递?