Как изменить содержимое столбца в каждой строке таблицы без использования реквизита в Vue.js (Элемент-пользовательский интерфейс)?

#html #vue.js #vuejs2 #element-ui #vue-props

#HTML #vue.js #vuejs2 #element-ui #vue-props

Вопрос:

Я когда-то застрял на этой проблеме. Я создал таблицу с 3 столбцами, из которых для двух столбцов я могу использовать свойство prop для отображения содержимого каждой строки для этих двух столбцов. Теперь, для третьего столбца, я хочу отобразить содержимое из другого массива, как мне отобразить эту информацию в третьем столбце.

Пожалуйста, найдите пример кода ниже:

Это HTML-код

 <el-table :data = "data_table">

<el-table-column
prop = "Id"
label= "Unique ID">
</el-table-column>

<el-table-column
prop = "color"
label = "Color">
</el-table-column>

<el-table-column
prop = ""
label = "Count">

  <template slot-scope="scope">

      <el-button type="text" @click="dialogVisible = true; get_total_count_users(scope.row)">{{users.length}}</el-button>
      <!--Skipping the code for dialog box..I have tested that part pretty well, so I know it works. -->

  </template>

</el-table-column>

</el-table>

  

Это часть кода javascript:

 <script>

export default {

  data(){
    return{
    data_table:[], // I fill the data_table array using some AJAX/Axios calls which has props Id and Color. 
    users: [], // I fill the users array using some AJAX/Axios calls which has multiple user information. 

};
},

methods:{
   get_total_count_users(row){
// axios call, etc. This part works successfully, I checked the values. 
}
}
</script>
  

Небольшое объяснение приведенного выше кода:
Я вызываю AJAX / Axios для API, который возвращает мне список / массив значений в массиве таблиц данных. В нем было два реквизита, то есть идентификатор и цвет. Я делаю еще один вызов axios / AJX для api, который возвращает мне список пользователей на основе идентификатора, присутствующего в этой строке таблицы. Каждая строка будет иметь уникальный идентификатор. Используя этот идентификатор, я делаю вызов axios для api.. пример, www.example /{{Id}}.com .Это возвращает мне список пользователей, связанных с этим идентификатором. Теперь моя следующая задача — отобразить общее количество пользователей (взяв длину массива users) и отобразить его в виде кнопки. Но, поскольку я не использую prop для отображения значений (длина массива пользователей для каждой строки), значение в кнопке отображается одинаково во всех строках. Он продолжает меняться для всего столбца, если я нажимаю кнопку в любой из строк.

функция get_total_count_users(scope.row) используется для вызова axios / AJAX для www.example /{{Id}}.com и хранит информацию о нескольких пользователях, связанную с этим идентификатором, в массиве users.

Пожалуйста, обратитесь к изображению ниже:

Изначально все значения равны 0, так как к идентификатору в первой строке привязано 0 пользователей. введите описание изображения здесь

Когда я нажимаю на кнопку 3-й строки (в которой изначально указано 0), все значения в этом столбце изменяются на 2, поскольку к идентификатору в 3-й строке привязаны два пользователя. введите описание изображения здесь

Следовательно, проблема здесь в том, что я просто хочу отобразить общее количество пользователей (количество) в каждой строке на основе этого идентификатора без использования свойства prop.

Надеюсь, приведенное выше объяснение и пример помогут понять проблему. Любая помощь будет оценена.

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

1. разве вы не можете изменить свой ответ на вызовы axios и в качестве ответа поместить данные в один массив?

2. Как нам объединить несколько ответов в один массив? PS: Я не могу изменить внутренний код, он был написан кем-то другим.

3. Я опубликовал решение… дайте мне знать об этом.

Ответ №1:

Ответ решит проблему, но не является конкретным решением, которое определено для получения данных из нескольких массивов в вашу таблицу данных.

Вы можете связать свои ответы axios, а затем использовать foreach для добавления переменных к вашему объекту внутри массива. Итак, я предполагаю, что вы вызываете метод при монтировании следующим образом:

 data: () => ({ tableData: [] }),
mounted() {
  this.getData();
}
  

теперь в вашей функции getData() выполните разные вызовы axios и поместите свой ответ в таблицу примерно так.

 methods: {
  getData() {
    var myTableData = [];
    axios({ method: 'GET', url: 'http://first-url', headers: [...] }).then(res => {
      //we have got the table data here
      myTableData = res.data;
      //looping through data and making axios calls based on data.
      myTableData.foreach((row, index) => {
        var newUrl = 'https://getdatafrom.com/'  row.id '/'; //using the data from previous call.
        axios({ method: 'GET', url: newUrl, headers: [...]}).then(res2 => {
        var counts = res.data; 
         // adding variable myCount to the table data array.
         row.myCount = counts[index];
       }).catch(err => { console.error(err)})
     })
        // setting data object 
        this.tableData = myTableData;
    }).catch(err => { console.error(err) })
  }
}
  

дайте мне знать, если у вас возникнут какие-либо проблемы.

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

1. спасибо за ваше решение. Но как мне вызвать второй URL-адрес? Мой второй URL основан на идентификаторах, которые я получаю из первого ответа axios. Пример, www.example/1/.com , www.example/22/.com … итак, эти 1, 22 и т.д. получены из результатов первого вызова axios. Я хочу включить этот идентификатор, а затем выполнить вызов API, используя эти www.example /{{id}}/URL-адреса.com.

2. я обновил ответ. Пожалуйста, проверьте. вам просто нужно было поместить вызовы axios в цикл foreach .

3. Вы только что пропустили одну строку в решении: myTableData[index] = строка за строкой.myCount = counts[index]; Нам нужно заменить существующую строку в myTableData новой обновленной строкой.

4. вам это не нужно, поскольку мы используем цикл foreach, а данные строки являются фактическими табличными данными, которые мы просматриваем.