vue.js - 如何将组件数据作为json发送到服务器?

标签 vue.js vuejs2 vue-component

这是我的设置:

<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>

因此,为了测试一切正常,我手动添加了一些组件:blockList: ['text-block', 'image-block', 'text-block']

页面上的所有内容都呈现良好。不过,我不会手动添加组件,但我会让用户添加它们,并且用户将能够添加任意数量的组件。将会有比我目前使用的 2 个更多的组件。

当我向页面添加 10 个不同的组件并且用户按下“保存”按钮时,我将如何将此数据发送到服务器?我不能只将 blockList 数组发送到服务器,因为它只是一个字符串数组。

我想要做的是跟踪已添加的所有组件,然后按一下按钮将包含所有组件及其属性的 json 发送到服务器,就像我在文本组件中输入了任何文本一样,或者,如果我已将图像上传到图像组件,我还需要将所有数据发送到服务器,以便在稍后重新加载页面以再次编辑时可以重新创建它。

那么我该如何做到这一点,因为 blockList: ['text-block', 'image-block', 'text-block'] 不会这样做?如何保留组件数组及其所有属性,并通过按下按钮将其发送到服务器?

最佳答案

构建您的组件以支持v-model。将您的 blockList 数据结构更改为如下所示:

const blockList = [
  {
    component: "text-block",
    model: null,
    label: "Name"
  },
  {
    component: "text-block",
    model: null,
    label: "Address"
  }
]

请注意,blockList 中的每个项目现在都有一个可用于从组件收集数据的模型。然后,使用 v-model 将您的组件绑定(bind)到 block 模型。

<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 并以相同的方式提交数据。

关于vue.js - 如何将组件数据作为json发送到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979211/

相关文章:

javascript - Vue.js 组件 html 输入模式验证不起作用

javascript - 为什么 Vue 组件不会在选择更改时更新

vue.js - vue Dynamic Slot Names Error Templates 应该只负责将状态映射到 UI

没有 v-model 的 Vue.JS 复选框

vue.js - 使用 Axios - VUEJS 存储为 Blob 的 POST 图像

vuejs2 - Vue js - 如何使用查询字符串路由请求

vue.js - 如何从 vue 中的回调访问本地组件变量?

npm - webpack 构建 css 规则与开发中的顺序不同

javascript - Vue.js 组件内部状态在底层数据更改时被重用

javascript - 复选框单击 v-for 循环内的无效数据