首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在列表中编辑记录,并使用VueJS动态定义子属性

在列表中编辑记录,并使用VueJS动态定义子属性
EN

Stack Overflow用户
提问于 2017-07-18 03:58:31
回答 1查看 1.3K关注 0票数 3

使用VueJS,我试图创建一个通用组件,它可以处理不同类型的记录。

例如,假设我有用户记录:

代码语言:javascript
复制
var users = [
  { UserID: 1, username: "pan",email:"peter.pan@neverland.com" },
  { UserID: 2, username: "john",email:"john.doe@somewhere.com" }
];

和组记录

代码语言:javascript
复制
var groups = [
    { GroupId: 1, groupName: "Users", description: "Lorem ipsum ..." },
    { GroupId: 2, groupName: "Admins", description: "Some people with super powers" }
];

我想创建一个Vue组件来编辑这些记录,因此可以这样定义它:

代码语言:javascript
复制
<record-editor v-bind:record="user[0]" title="Edit user">
  <text-editor label="User name" property="username"></text-editor>
  <text-editor label="Email" property="email"></text-editor>
</record-editor>

<!-- For the binding syntax, I am not sure what should 
     I use to bind to a record in the lists shown before -->

<record-editor v-bind:record="groups[0]" title="Edit group"> 
  <text-editor label="groupName" property="groupName"></text-editor>
  <text-editor label="Description" property="description"></text-editor>
</record-editor>

现在,我要说的是:

代码语言:javascript
复制
(function() {
    var textEditor = Vue.component('text-editor', {
        template: "#text-editor",
        props: ['label', 'property']
    });

    var recordEditor= Vue.component('record-editor', {
        template: '#model-editor',
        props: ['title', 'record']
    });

    var vue = new Vue({
      el:"#someContainer",
      data: {
        users : users,
        groups: groups
      }
    })
}())

<template id="text-editor">
    <div>
        <label v-bind:for="property">{{label}}</label>

        <!-- need help figuring what to put in v-bind:value -->
        <input type="text" v-bind:name="property" 
                           v-bind:id="property"
                           v-bind:value="">
    </div>
</template>

<template id="record-editor">
    <div>
        <h2>{{title}}</h2>
        <form>
            <slot></slot>
        </form>
    </div>
</template>

所以基本上,我遗漏的是如何绑定到列表中的元素来编辑它们。

以及如何动态定义子组件的属性(文本编辑器)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-18 04:36:46

您可以使用scoped slotsv-model做任何您想做的事情。下面是一个有效的示例。

代码语言:javascript
复制
console.clear()

var users = [
  { UserID: 1, username: "pan",email:"peter.pan@neverland.com" },
  { UserID: 2, username: "john",email:"john.doe@somewhere.com" }
];

var groups = [
    { GroupId: 1, groupName: "Users", description: "Lorem ipsum ..." },
    { GroupId: 2, groupName: "Admins", description: "Some people with super powers" }
];

var textEditor = Vue.component('text-editor', {
  template: "#text-editor",
  props: ['label', 'value'],
  computed:{
    property:{
      get(){ return this.value},
      set(v){this.$emit("input", v)}
    }
  }
});

var recordEditor= Vue.component('record-editor', {
  template: '#record-editor',
  props: ['title', 'record']
});

var vue = new Vue({
  el:"#app",
  data: {
    users : users,
    groups: groups
  }
})
代码语言:javascript
复制
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">
  <record-editor v-bind:record="users[0]" title="Edit user">
    <template scope="{record}">
    <text-editor label="User name" v-model="record.username"></text-editor>
    <text-editor label="Email" v-model="record.email"></text-editor>
  </template>
  </record-editor>
  {{users}}
</div>

<template id="text-editor">
    <div>
        <label>{{label}}</label>
        <input type="text" v-model="property">
    </div>
</template>

<template id="record-editor">
    <div>
        <h2>{{title}}</h2>
        <form>
            <slot :record="record"></slot>
        </form>
    </div>
</template>

我删除了您在文本编辑器中执行的标签和id绑定,主要是因为对于输入元素来说,email地址是无效的id。基本上,我更新了您的text-editor以使用v-model,它将替代您的property绑定。需要作用域插槽,因为您正在定义要在record-editor上编辑的模型。作用域插槽允许您将数据从封闭作用域传递到所包含的组件。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45152645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档