如何将组件数据作为json发送到服务器?
这是我的设置:如何将组件数据作为json发送到服务器?
<template>
<div id="" style="min-height: 100px">
<template v-for="(block, index) in blockList">
<component :is="block"></component>
</template>
</div>
</template>
<script>
import TextBlock from './blocks/TextBlock.vue'
import ImageBlock from './blocks/ImageBlock.vue'
export default {
data: function data() {
return {
blockList: ['text-block', 'image-block', 'text-block']
}
},
props: {
blocks: {type: Array}
},
// afterMount() {
// this.blocks.push(['text-block']);
// },
components: {
TextBlock,
ImageBlock
}
}
</script>
<style lang="scss">
</style>
所以只是为了检验一切工作我手动添加一些组件:黑名单:“文本块”,“图像块”,“文本块”]
和一切呈现在页面上罚款。但是,我不会手动添加组件,但我会让用户添加它们,用户将能够添加任意数量的组件。当前有2个组件会使用更多的组件。
当我添加可以说10个不同的组件到页面和用户按保存按钮,我会怎么去发送这个数据到服务器?我不能只将blockList数组发送到服务器,因为这只是一个字符串数组。
我想要做的是跟踪所有已添加的组件,然后用按钮将所有组件及其属性的属性(如果我已将任何文本输入到文本组件中)发送到服务器的json ,或者如果我已经将图像上传到图像组件中,则需要将所有数据发送到服务器,以便在稍后重新加载页面以供再次编辑时重新创建它。
那么我怎么能做到这一点作为blockList:['文本块','图像块','文本块']不会做?如何保存一组组件及其所有属性,并按下按钮将其发送给服务器?
构建您的组件以支持v-model
。更改blockList
数据结构是这个样子:
const blockList = [
{
component: "text-block",
model: null,
label: "Name"
},
{
component: "text-block",
model: null,
label: "Address"
}
]
请注意,每个在blockList
的项目现在有一个model
你可以用它来从组件收集数据。然后,使用v-model
将组件绑定到块模型。
<component v-for="item in blockList"
:is="item.component"
v-model="item.model"
:label="item.label"
:key="item">
</component>
下面是一个例子组件实现:
const TextBlock = {
props:["value", "label"],
template: `
<div>
{{label}}
<input type="text" @input="$emit('input', $event.target.value)" :value="value">
</div>
`
}
现在,在每个blockList
元素将包含从该组件收集的数据。如果要保存该数据,请遍历blockList
并提取要提交的数据。
这里是working example。
在这个例子中,我没有完成提交数据的工作,你可以自己解决这个问题。我也没有实现ImageBlock组件;无论如何,我不知道你想如何工作。但是遵循相同的模式,您应该能够在ImageBlock组件上支持v-model
并以相同的方式提交数据。
哇谢谢,这是很好的答案。你能澄清当v-model =“item.model”运行时会发生什么吗?因为初始化时model = null,它什么时候变成别的东西然后是null?也是这样做的:@input =“$ emit('input',$ event.target.value)”? –
@maxit'v-model'是一个指令“对表单输入元素或组件的双向绑定”。请参阅[文档](https://vuejs.org/v2/api/#v-model)。代码'@input = ...'将一个事件处理程序附加到'input'元素的'input'事件并发出输入元素的当前值。由于'v-model'默认监听'输入'事件,'item.model'将会用输入元素的新值更新。 – Bert
好吧,我现在得到它,模型将得到我输入到文本框中的值,这就是为什么:this this.blockList.map(b => b.model)与此收集的数据结合:{{values}}给出我回到我输入的值。但问题在于,我想不仅向服务器发送我输入的值,还要发送组件类型以及在组件中定义的任何其他设置,例如我可以让用户自定义该组件的某些设置,宽度,高度等等 那么我将如何通过一个blockList循环,并拉动每个组件及其数据? –