V-для с шаблоном - PullRequest
       30

V-для с шаблоном

0 голосов
/ 20 ноября 2018

Я использую vue-bootstrap. Я пытаюсь создать динамический компонент сетки, который получает заголовки и данные. Поскольку мы не будем знать, сколько столбцов передано компоненту, мы должны проверить каждый переданный элемент.

<template>
    <b-table striped hover :items="items"></b-table>
        <div v-for="title in items">
          <template slot="title.key" slot-scope="data">
            <input v-if="title.isActive" type="text" v-model="data.value">
            <textarea v-else type="text" v-model="data.value"></textarea>
          </template>
        </div>
   </b-table>
</template>

<script>
const items =[
      {'label': 'Description', 'key': 'description'},
      {'label': 'Name',  'key': 'name', 'isActive': true},
    ]

Таким образом, если isActive имеет значение true, тогда этот шаблон должен быть textarea (столбец должен быть изменен с textarea вместо ввода). Однако он не работает, и никакие столбцы не изменились ни в поле ввода, ни в текстовой области и остаются шаблоном по умолчанию

Не могли бы вы помочь по этому вопросу.

Спасибо

Ответы [ 5 ]

0 голосов
/ 20 ноября 2018

Вы можете проверить этот пример для динамических столбцов.

new Vue({
  el: "#app",
  data: {
    fields: [{
      key: "id",
      label: "Id",
      colType: "span"
    }, {
      key: "name",
      label: "Name",
      colType: "button"
    }, {
      key: "uhh",
      label: "uhh..",
      colType: "idk"
    }],
    items: [{
      id: 0,
      name: "Test 0"
    }, {
      id: 1,
      name: "Test 1"
    }, {
      id: 2,
      name: "Test 2"
    }]
  }
});
<div id="app">
  <b-table :items="items" :fields="fields">
    <template v-for="(field, index) in fields" :slot="field.key" slot-scope="data">
      <div v-if="field.colType === 'button'">
        <h5>{{data.item.name}}</h5>
        <b-button>Am Button</b-button>
      </div>
      <div v-else-if="field.colType === 'span'">
        <h5>{{data.item.name}}</h5>
        <span>Am Span</span>
      </div>
      <div v-else>
        <h5>{{data.item.name}}</h5>
        Am Confused
      </div>
    </template>
  </b-table>
</div>
0 голосов
/ 20 ноября 2018

Благодаря ответу ittus, после незначительной модификации работает следующий способ.

<template v-for="column in columns" :slot="column.key" slot-scope="item">
<input v-if="item.isSelect" type="text" v-model="item.value">
<textarea v-else type="text" v-model="item.value"></textarea>
</template>

Спасибо всем.

0 голосов
/ 20 ноября 2018

Так как свойство isActive присутствует внутри объекта в массиве items, вам необходимо обращаться к нему как к свойству итерируемого.

Так код становится:

<div v-for="title in items">
  <template slot="{{title.key}}" slot-scope="{title}">
    <input v-if="title.isActive" type="text" v-model="title.value">
    <textarea v-else type="text" v-model="title.value"></textarea>

  </template>
</div>
0 голосов
/ 20 ноября 2018

Я думаю, вы должны разделить title в переменной v-for и slot-scope, чтобы избежать путаницы:

<template v-for="title in items" :key="title.key">
  <template :slot="title.key" slot-scope="item">
    <input v-if="item.isActive" type="text" v-model="item.value">
    <textarea v-else type="text" v-model="item.value"></textarea>
  </template>
</template>
0 голосов
/ 20 ноября 2018

Вы должны использовать ниже фрагмент.

<input v-if="title.isActive" type="text" v-model="title.value">
<textarea v-else type="text" v-model="title.value"></textarea>
...