отображение выбора, флажков, выбора даты и т.д. Динамически на основе файла json

#javascript #vue.js #vuejs2 #bootstrap-vue

Вопрос:

Дополнительный вопрос к вопросу обо мне перед

Я динамически отображаю поля ввода на основе моего файла json — теперь я хочу отображать выбор, флажки и указатель даты, а также на основе их групп.

Как я могу это решить — мне нужно вставить эти элементы в computedJSON, но запись, например, в selection options: item.selection не работает.

шаблон:

 <table>
  <tbody>
    <tr v-for="(group, key) in getComputedJson" :key="key">
      <div v-for="(item, indexer) in group" :key="indexer">
        <b-form-input v-if="item.type" :type="item.type"></b-form-input>
        <b-form-select v-if="item.selection" :options="item.selection"></b-form-select>
        <b-form-checkbox-group v-if="item.checkbox" :options="item.checkbox"></b-form-checkbox-group>
        <b-form-datepicker v-if="item.date"></b-form-datepicker>

     </div>
    </tr>
  </tbody>
</table>
 

скрипт:

 <script>
export default {
 computed: {
  getComputedJson() {
   const computedJson = {};
   this.json.forEach(item => {
    if(!computedJson[item.group]) {
     computedJson[item.group] = [];
     computedJson[item.group].push({label: item.label, type: item.type}); //Need to input here my selection, checkbox and datepicker 
    } else {
    computedJson[item.group].push({label: item.label, type: item.type}); //Here too 
   }
  }
return computedJson;
}
</script>
 

новый json:

 [
    {
        "label": "Input 1",
        "type": "text",
        "group": "Test1"
    },
    {
        "label": "Input 2",
        "type": "text",
        "group": "Test2"
    },
    {
        "label": "Input 3",
        "type": "text",
        "group": "Test3"
    },
    {
        "label": "Input 4",
        "type": "number",
        "group": "Test1"
    },
    {
        "label": "Selection",
        "selection": [
                { "text": "Selection 1" },
                { "text": "Selection 2" },
                { "text": "Selection 3" }
              ],
        "group": "Test2"
    },
    {
        "label": "Checkbox",
        "selection": [
                { "text": "Checkbox 1" },
                { "text": "Checkbox 2" },
                { "text": "Checkbox 3" }
              ],
        "group": "Test1"
    },
    {
        "label": "Date",
        "date": "yes",
        "gruppe": "Test3"
    }
]
 

Ответ №1:

В соответствии с вашим новым json попробуйте изменить условие v-if и options поддержите, как показано ниже

 <table>
  <tbody>
    <tr v-for="(group, key) in getComputedJson" :key="key">
      <div v-for="(item, indexer) in group" :key="indexer">
        <b-form-input v-if="item.type" :type="item.type"></b-form-input>
        <b-form-select v-if="item.label === 'Selection'" :options="item.selection"></b-form-select> // change added
        <b-form-checkbox-group v-if="item.label === 'Checkbox'" :options="item.selection"></b-form-checkbox-group> // change added
        <b-form-datepicker v-if="item.date"></b-form-datepicker>
     </div>
    </tr>
  </tbody>
</table>
 

Изменено вычисляемое свойство

 <script>
export default {
 computed: {
  getComputedJson() {
   const computedJson = {};
   this.json.forEach(item => {
    if(!computedJson[item.group]) {
     computedJson[item.group] = [];
     if(item.label === 'Checkbox' || item.label === 'Selection') {
      computedJson[item.group].push({label: item.label, selection: item.selection, type: item.type}); // Provided you should have the options in item.selection
     } else {
      computedJson[item.group].push({label: item.label, type: item.type});
    } else {
     if(item.label === 'Checkbox' || item.label === 'Selection') {
      computedJson[item.group].push({label: item.label, selection: item.selection, type: item.type}); // Provided you should have the options in item.selection
     } else {
    computedJson[item.group].push({label: item.label, type: item.type});
    }
   }
  }
return computedJson;
}
</script>
 

Комментарии:

1. Спасибо — но как я могу подтолкнуть его к своему столу? Потому что только с computedJson[item.group].push({label: item.label, type: item.type}); этим ничего не получается..

2. Проверьте отредактированный ответ