powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Обновить props в функциональном компоненте Nuxt Js.
1 сообщений из 1, страница 1 из 1
Обновить props в функциональном компоненте Nuxt Js.
    #39960805
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, мне необходимо реализовать страничку в виде таблицы, на которой в строках содержится список людей, а по столбцам - оставшиеся дни месяца учитывая текущую дату.
На пересечении строк и столбцов находится элемент, по нажатию которого этот элемент должен визуально отобразить, что он был нажат(по аналогии с CheckBox) и должны прослушиваться все события нажатия в родительском компоненте.
Чтобы столбцы были ровными я решил сделать разметку с использованием CssGrid, то есть я высчитываю сколько дней в месяце, добавляю один столбец для ФИО сначала.
То есть количество строк и количество столбцов может различаться.
Код главного компонента
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
<template>
  <div class="setAcsessDayContainer">
    <style>
      :root {
        --columnCount: {{ columnCount}};
      }
    </style>
    <div class="setAcsessDayPageContent">
      <h1 class="primaryText">
        Таблица
      </h1>
      <MounthPicker @mounthChanged="mounthChanged" />
      <div class="dayTable">
        <SelectWorkDayComponent
          v-for="person of stuff"
          :fio="person.fio"
          :days="person.days"
          :key="person.id"
          :hkey="person.id"
          :cssClass="person.cssClass"
          @daySelected="daySelected"
        />
      </div>
    </div>
  </div>
</template>

<script>
import { loadStuffByDepartment } from "../dataservices/stuff"; // сервис по получению информации о сотрудниках(строки в таблице)
import SelectWorkDayComponent from "../components/selectWorkDayComponent";//Компонент, представляющий собой одну строку таблицы
import MounthPicker from "../components/MounthPicker";//компонент выбора месяца, от которого изменяется количество столбцов

export default {
  transition: "layout",
  async asyncData() {
    const stuffResponse = await loadStuffByDepartment({ departmentID: "d1111" });
    return {
      stuff: stuffResponse.bodyResponse.stuff,
      days: []//количество дней-столбцов
    };
  },
  computed: {
    columnCount: function() {
      return ++this.days.length;
    }
  },
  methods: {
    mounthChanged(days) {
   //выбрали другой месяц, соответственно нужно поменять количество столбцов
      if (!this.stuff) {
        return;
      }
      this.stuff.forEach(person => {
        person.days = days;
        person.cssClass = "primaryText chip";
      });
      this.days = days;
    },
    daySelected(day) {
       //сюда приходит информация о том на каком дне "кликнули"

      const person = this.stuff.find(f => f.id === day.personID);
      if (person) {
        person.cssClass = "primaryText chip selected";
      }
    }
  },
  components: {
    SelectWorkDayComponent,
    MounthPicker
  }
};
</script>
<style scoped>
.setAcsessDayContainer {
  height: 100vh;
}
.setAcsessDayPageContent {
  width: 100%;
  text-align: center;
}
.dayTable {
  display: grid;
  grid-template-columns: repeat(var(--columnCount), 1fr);
  grid-gap: 1em;
}

.personItem {
  background: lawngreen;
  opacity: 0.6;
  height: 100px;
}
</style>



Ввиду того, что для CssGrid необходимо, чтобы все элементы находились на одном уровне вложенности, один компонент SelectWorkDayComponent должен рисоваться следующим образом
Код: xml
1.
2.
3.
4.
5.
6.
    <div>FIO</div>
    <div>1</div>
    <div>2</div>
    <div>3</div>
   ///
   <div>Последний день месяца</div>


Но ввиду того, что в Template можно использовать только 1 корневой элемент, единственная возможность обойти это ограничение, это использование функциональных компонентов.

//SelectWorkDayComponent.vue
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
<script>
export default {
  functional: true,
  render: function(createElement, { props, listeners }) {
    const tagArr = [];
    tagArr.push(createElement("div", { class: "primaryText" }, props.fio));
    let dayArr = [];

    if (props.days) {
      dayArr = props.days.map(f => {
        return createElement(
          "div",
          {
            class: props.cssClass,
            on: {
              click: event => {
                const emit_event = listeners.daySelected;

                emit_event({ personID: props.hkey, day: f });
              }
            }
          },
          f
        );
      });
    }
    return [...tagArr, ...dayArr];
  },

  props: {
    cssClass: { type: String },
    hkey: { type: String },
    fio: {
      type: String,
      default: "Неизвестный сотрудник"
    },
    days: {
      type: Array
    }
  }
};
</script>

<style scoped>
.chip {
  padding: 10px;
  border-radius: 25px;
  background-color: transparent;
  border: 1px solid;
  transition: transform 0.2s ease, color 0.2s ease;
}

.selected {
  background: blueviolet;
}
.chip:hover {
  border-color: #30d5c8;
}
</style>



Все рисуется нормально, нажатие тоже отрабатывает корректно, но я никак не могу применить другой стиль для div, на который нажали. Обновление props из родительского компонента не работает, свойства не реактивны.
Изменять элемент внутри события "Click" тоже нельзя, потому что он "ReadOnly".
Подскажите плиз что можно сделать.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Обновить props в функциональном компоненте Nuxt Js.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]