Флажки для скрытия / отображения столбцов в таблице Vue.js не работают должным образом

Я сделал таблицу начальной загрузки vue.js для загрузки некоторых данных из локальных файлов JSON. Я пытаюсь реализовать отображение / скрытие столбцов с помощью флажков. Я думаю, что решил большую часть проблемы, но проблема в том, что когда я скрываю столбец, а затем снова нажимаю на тот же флажок (чтобы снова сделать столбец видимым), я теряю порядок таблицы (этот столбец становится последним столбцом) и поэтому на. Например, если я скрываю столбец «Отметка времени», который является первым заголовком таблицы в моей таблице, а затем нажимаю, чтобы показать его снова, он больше не находится на первом месте, вместо этого он создается на последнем месте.

https://imgur.com/BaTfgci -> вот как приложение выглядит сейчас https://codepen.io/frane_caleta/pen/KKPMKrL -> codepen моего кода, вы не будете иметь возможность загрузить его без файла JSON, хотя https://imgur.com/a/23jx0lZ - > Пример данных JSON

Впервые задаете вопрос здесь, поэтому не стесняйтесь спрашивать меня, нужна ли вам дополнительная информация для решения проблемы :)

<b-form-group label="Hide columns: ">
  <b-form-checkbox-group id="checkbox-group-1" v-model="selected" :options="fields" name="flavour-1">
  </b-form-checkbox-group>
</b-form-group>

//my table
<b-table id="myTable" 
         :small="small" 
         :bordered="bordered"
         hover head-variant="dark"  
         stacked="md" 
         :items="cptItems" 
         :fields="selected" 
         :current-page="currentPage"
         :per-page="perPage" 
         :filter="filter" 
         :sort-by.sync="sortBy" 
         :sort-desc.sync="sortDesc"
         @filtered="onFiltered"
         :tbody-tr-class="rowClass"
          v-if="selected.length > 0">
</b-table>
//Javascript file
function initializeVue() {
  return new Vue({
        el: '#app',
        data() {
          return {
            items: data.logdatas,
            selected: [],
            fields: [{
                  text: 'Origin',
                  value: {
                    key: 'origin',
                    label: 'Origin',
                    sortable: true,
                    class: 'text-center',
                    index: 0
                  }
                },
                {
                  text: 'Timestamp',
                  value: {
                    key: 'timeStamp',
                    label: 'Timestamp',
                    sortable: true,
                    class: 'text-center',
                    index: 1
                  }
                },
                {
                  text: 'Level',
                  value: {
                    key: 'level',
                    label: 'Level',
                    sortable: true,
                    class: 'text-center',
                    index: 2
                  }
                }, ...there are 4 more fields here like this...

                //my method for creating those checkboxes
                created() {
                  this.selected = this.fields.map(field => field.value);
                }

person Frane Caleta    schedule 16.08.2019    source источник
comment
Не могли бы вы вставить свой код в codepen?   -  person Yigit Tanriverdi    schedule 16.08.2019
comment
@YigitTanriverdi Готово, отредактировал в своем посте :)   -  person Frane Caleta    schedule 16.08.2019
comment
не могли бы вы поместить фиктивные данные в код? @Frane Caleta   -  person Yigit Tanriverdi    schedule 16.08.2019
comment
@YigitTanriverdi Я добавил изображение данных JSON, надеюсь, это поможет вам понять, как они должны выглядеть   -  person Frane Caleta    schedule 16.08.2019
comment
добавьте свой json в качестве локального контекста вашего вопроса.   -  person Christian Carrillo    schedule 16.08.2019
comment
@ChristianCarrillo Я не понимаю, что вы имеете в виду. Это большой файл json, вы хотите, чтобы я вставил его в другой код или что-то в этом роде?   -  person Frane Caleta    schedule 17.08.2019
comment
Дизайн флажков может работать для небольшого количества столбцов. Если у вас их больше, страница будет загромождена. Вы бы использовали компонент пользовательского интерфейса для выбора столбцов для лучшего UX.   -  person Junji Zhi    schedule 08.01.2021


Ответы (1)


selected данные - ваш виновник. b-checkbox-group :selection перечисляет элементы в порядке выбора.

example2

b-table :fields перечисляет столбцы в порядке элементов.

лучше сделать статический fields-список и фильтровать по selection.

// make this data or property
let columnNames = ["one", "two", "three", "infinity", "pi"];

// make this data
let selected = []

//make this computed // can be optimized 
let activeFields = columNames.filter(name => selected.includes(name))
// more like this
export default {

  data(){
    return {
      selected: [],
      columnNames: ['name1', 'name2']
  },
  computed(){
    activeColumns(){

      return this.columnNames.filter(this.selected.includes) || []
  }
}

const app = new Vue({
  data(){
    return {
      currentPage: 0,
      perPage: 10,
      fields: ['age', 'first_name', 'last_name'],
      //selected: [],
      selected: ['age', 'first_name', 'last_name'],
      items: [
          { age: 40, first_name: 'Dickerson', last_name: 'Macdonald' },
          { age: 21, first_name: 'Larsen', last_name: 'Shaw' },
          { age: 89, first_name: 'Geneva', last_name: 'Wilson' },
          { age: 38, first_name: 'Jami', last_name: 'Carney' }
        ]
    }
  },
  computed: {
    activeFields(){
      return this.fields.filter(name => this.selected.includes(name))
    }
  }
}).$mount("#app");
<!-- Add this to <head> -->

<!-- Load required Bootstrap and BootstrapVue CSS -->
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap/dist/css/bootstrap.min.css" />
<link type="text/css" rel="stylesheet" href="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.css" />

<!-- Load polyfills to support older browsers -->
<script src="//polyfill.io/v3/polyfill.min.js?features=es2015%2CIntersectionObserver" crossorigin="anonymous"></script>

<!-- Load Vue followed by BootstrapVue -->
<script src="//unpkg.com/vue@latest/dist/vue.min.js"></script>
<script src="//unpkg.com/bootstrap-vue@latest/dist/bootstrap-vue.min.js"></script>

<div id="app">
<b-form-group label="Hide columns: ">
  <b-form-checkbox-group id="checkbox-group-1" v-model="selected" :options="fields" name="flavour-1">
  </b-form-checkbox-group>
</b-form-group>


<b-table id="myTable" 
         
         :bordered="true"
         hover head-variant="dark"  
         stacked="md" 
         :items="items" 
         :fields="selected" 
         :current-page="currentPage"
         :per-page="perPage" 
         tbody-tr-class="row-class"
          v-if="selected.length > 0">
</b-table>
<b-table id="myTable" 
         
         :bordered="true"
         hover head-variant="dark"  
         stacked="md" 
         :items="items" 
         :fields="activeFields" 
         :current-page="currentPage"
         :per-page="perPage" 
         tbody-tr-class="row-class"
          v-if="selected.length > 0">
</b-table>
</div>

person Estradiaz    schedule 16.08.2019
comment
Не могли бы вы привести мне пример того, как сделать эти поля статическими или исправить мой код, если это возможно? Я думаю, что знаю, что вы пытаетесь сказать, но не совсем уверен, как это реализовать - person Frane Caleta; 17.08.2019
comment
@FraneCaleta добавил кое-что, чтобы обрисовать идею - person Estradiaz; 17.08.2019
comment
И где именно я должен использовать (вызывать) созданный мной вычисленный метод? Извините за так много вопросов, что-то вроде нового для Vue: ‹ - person Frane Caleta; 17.08.2019
comment
@FraneCaleta в вашем компоненте vue, таком как cptItems и т. Д. - person Estradiaz; 17.08.2019
comment
Итак, я пытаюсь добавить: columnNames = [origin, timestamp, level, loggerName, direction, thread, actions], Computed method like this: cptTest () {let activeFields = columnNames.filter (name = ›selected. включает (имя)); } А затем в моей таблице начальной загрузки добавлено: fields = cptTest, а также в группе флажков: options = activeFields. Я получаю ошибку в columnNames - ›недействительный инициализатор сокращенного свойства - person Frane Caleta; 17.08.2019
comment
А вобще: fields = activeColumns? Это тоже не работает: (( - person Frane Caleta; 17.08.2019
comment
@FraneCaleta я сделал вам рабочий фрагмент с обеими версиями ...: fields = selected &: fields = activeFields - person Estradiaz; 17.08.2019
comment
Спасибо, наконец-то работает! Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что эти флажки не выбраны заранее, и я не могу добавить дополнительные параметры, как раньше, например: fields: [{text: 'Origin', value: {key: 'origin', label: 'Origin', sortable: true, class: 'text-center', index: 0}} ... потому что теперь это выглядит так: fields: ['timeStamp', 'origin', 'level', 'loggerName' , 'направление', 'поток', 'действия'] - person Frane Caleta; 17.08.2019
comment
Но вы уже очень мне помогли, так что думаю, я могу попробовать решить эту проблему самостоятельно и больше не тратить ваше время :) - person Frane Caleta; 17.08.2019
comment
@FraneCaleta, я думаю, вам не хватает некоторых основных навыков JavaScript - я предлагаю вам сделать несколько примеров мутации массивов и объектов (на) мин. 30 - в SO: вопросы, например, как сортировать ... И так в;) - добро пожаловать - person Estradiaz; 17.08.2019
comment
Извините, что снова беспокою вас, но если я попробую некоторые мутации, другие вещи, похоже, не работают, и я просто не знаю, как сделать эти флажки предварительно выбранными сейчас, когда я сделал это таким образом (он был предварительно выбран раньше Внес твои изменения). Не могли бы вы помочь мне, раз уж вы знаете мое приложение? : ‹ - person Frane Caleta; 20.08.2019
comment
Да, я в курсе, как это должно работать, но в моем приложении этого почему-то нет ... - person Frane Caleta; 20.08.2019
comment
codepen.io/frane_caleta/pen/KKPgeva --- ›это то, что у меня есть прямо сейчас (с вашим выбранным) - person Frane Caleta; 20.08.2019
comment
@FraneCaleta заблокирован кодом - проверка адреса электронной почты - 404 - person Estradiaz; 20.08.2019