Ответы пользователя по тегу Vue.js
  • Как при наведении на svg появлялся текст?

    @postya
    data:() ({
    hasText: false
    })
    
    meathods: {
    showText() {
    this.hasText = true
    }
    
    hideText() {
    this.hasText = false
    }
    }


    <div class="flag flag--ru" @mouseover="showText" @mouseleave="hideText">
          <svg>
             <use xlink:href="@/assets/svg/svg.svg#flag-ru"></use>
           </svg>
    </div>
    
    <p v-if="hasText">any text</p>
    Ответ написан
    Комментировать
  • Как запретить выводить определенные элементы через VUE если в bitrix установлен флажок поля "нет"?

    @postya
    Тебе не нужно запрещать, тебе нужно вывести только те жлементы, которые соотвесттвуют значению в поле из бэкенда

    <div class="apartment-search-result" v-for="(item, index) in showedItems" :key="`apart_${item.id}`">
    <p v-if="item.sold === 'yes'"> Показывает толкьо проданные</p>
    </div>


    вот так не обьязательно писать
    :key="`apart_${item.id}`"

    можно просто
    :key="item.id"
    Ответ написан
    Комментировать
  • Как правильно получать данные с базы?

    @postya
    Можно и в одной таблице вывести все данные, если тебе удобно так. faqData выглоядит как объект, а не массив с данными, как выглядит массив который нужно получить?
    Ответ написан
  • Как сделать меню, как на официальном сайте vue js?

    @postya
    В боком меню не теги H, а теги li в которых находится тег a. Можешь проверить это в инспекторе.
    Каждый элемент в списке в боковом меню это router link.
    У router link есть два класса
    .router-link-active и .router-link-exact-active

    ты можешь переопределить стили для активного линка либо в конкретном компоненте(например компонент бокового меню) либо в общем файле, где содержатся глобальные стили

    .router-link-exact-active {
    color: red;
    }


    Пример с подзаголовками:
    сделай боковое меню отдельным компонентом. Создай там переменную, в которую будешь назначать текущий роут. Показывай/ скрывай нужные блоки в зависимости от значения этой переменной
    размести нужные позаголовки в блоке, и в этом блоке добавь v-if
    Блок с подзаголовками будет открываться в закисимости от условий, которые прописаны в v-if

    Codesandbox

    Только вместо div у тебя будет router link
    Ответ написан
  • Как лучше развернуть и построить MEVN приложение с Nuxt?

    @postya
    У тебя VPS от Beget? если да, то можешь удаленно подключиться к серверу и установить на виртуальной машине Beget Mongo DB, если не VPS, а просто предоставленные отдельно услуги, то попроси,чтобы тебе установили MOngo DB и дали к ней доступ.
    У тебя монолитное приложение на Nuxt?
    Nuxt - Это фронт, который по большей части делается отдельно от бэка. Получение и отправление данных в БД осуществляется в Nuxt через fetch, либо библиотекой можно, например axios.
    Ответ написан
    Комментировать
  • Почему не приминяется кастомный шрифт во Vue с Sass?

    @postya Автор вопроса
    В файле fonts.scss в строке src был неправилньо указан format, сделать нужно вот так:
    src: url("~@/assets/fonts/Modak/Modak-Regular.ttf") format("truetype");
    Ответ написан
    Комментировать
  • Почему vuelidate не может определить form?

    @postya Автор вопроса
    Оказалось,что блок validations был не в том скоупе)
    Полная валидация выглядит так:

    <template>
      <div class="login">
        <div class="container">
          <h1>Login</h1>
          <form class="form" @submit.prevent="login">
            <input
              type="text"
              placeholder="username"
              v-model.trim="form.username"
              :class="$v.form.username.$error ? 'invalid-feedback' : ''"
              class="input"
            />
            <span :class="$v.form.username.$error ? 'showError' : 'hideError'"
              >Username is required</span
            >
            <input
              type="password"
              placeholder="password"
              v-model.trim="form.password"
              :class="$v.form.password.$error ? 'invalid-feedback' : ''"
              class="input"
            />
            <span :class="$v.form.password.$error ? 'showError' : 'hideError'"
              >Password is required</span
            >
            <div class="button">
              <button class="btn-login">Login</button>
            </div>
          </form>
        </div>
      </div>
    </template>
    
    <script>
    import { required } from 'vuelidate/lib/validators'
    
    export default {
      name: 'login',
      head() {
        return {
          title: 'Login',
          meta: [
            {
              hid: 'login',
              name: 'login',
              content: 'login content',
            },
          ],
        }
      },
      data: () => ({
        form: {
          username: '',
          password: '',
        },
      }),
      methods: {
        login() {
          this.$v.form.$touch()
          if (this.$v.form.$error) {
            return
          }
          console.log('success')
        },
      },
      mounted() {},
      validations: {
        form: {
          username: { required },
          password: { required },
        },
      },
    }
    </script>
    Ответ написан
  • Почему CSS по-разному отображается на других комптютерах?

    @postya Автор вопроса
    Дико извеняюсь за свой вопрос, проблема была в том, что у людей был настроен разный масштаб отображения в браузере:D
    Ответ написан
    Комментировать
  • Как использовать тот же компонент множество раз, но с разными данными во Vue?

    @postya Автор вопроса
    благодаря наводке Rsa97 я нашёл решение:

    Дочерний компонент Connector.vue:

    <template>
      <div class="connector">
        <p>{{connector}}</p>
      </div>
    </template>
    
    <script>
      export default {
        name: "Connector",
        data() {
          return {
            sections: {
              length: ""
            },
          }
        },
        props: {
          connector: String
        }
      }
    </script>


    Родительский компонент Module.vue:
    <template>
      <div class="module">
           <Connector class="connector con1" :connector="input1"/>
        <Connector class="connector con2" :connector="input2"/>
        <Connector class="connector con3" :connector="output1"/>
        <Connector class="connector con4" :connector="output2"/>
      </div>
    </template>
    
    <script>
      import Connector from "components/Connector";
      export default {
        name: "Module",
        components: {Connector},
        data() {
          return {
            input1: 'input1',
            input2: 'input2',
            output1: 'output1',
            output2: 'output2'
          }
        }
      }
    </script>
    Ответ написан
  • Медиа запросы или разные компоненты во Vue проекте для адаптивности?

    @postya Автор вопроса
    Использовал вариант с применением разных компонентов для адаптивности и создал вызов функции при ресайзе окна так:

    created() {
        this.handleView();
        window.addEventListener("resize", this.handleView);
        console.log(this.pageView);
      },
      destroyed() {
        window.removeEventListener("resize", this.handleView);
        console.log(this.pageView);
      }
    Ответ написан
    Комментировать
  • Как изменить css в библиотеке, которую использует моё приложеине на netlify?

    @postya Автор вопроса
    Благодарю всех за ответы!
    Решил задачу следующим способом:
    в файле main.js , где я подключал vue toast notification я также подключил глобальный файл для css стилей( global.css)

    В этом файле Я могу видеть все классы от библиотеки .В нём я переопределил css селекторы.
    Но, из-за того,что файлы библиотеки имеют больший приоритет, то я для каждого переопределенного атрибута добавил флаг !important

    Пример:
    .notices .toast .toast-icon {
      height: 31px !important;
      width: 31px !important;
      min-width: 31px !important;
    }


    на Netlify все изменения удачно применились
    Ответ написан
    Комментировать
  • Как сделать адаптивный текст в блоке фиксированной ширины?

    @postya Автор вопроса
    я нашел решение задачи, применив подсказки qqFE и pupenne
    Только адаптировал всё под Vue js:

    Видео

    html:
    <div class="question-card" ref="card">
          <p
            class="question-text"
            ref="cardText"
            :style="{ fontSize: fontSize + 'rem' }"
          >
            {{ text }}
          </p>
        </div>


    в разделе script:
    <script>
    export default {
      beforeCreate() {
        this.calculateFontSize();
      },
      mounted() {
        this.calculateFontSize();
      },
      data: () => ({
        textWidth: 0,
        cardWidth: 0,
        cardHeight: 0,
        textHeight: 0,
        fontSize: 6,
        text:
          "there is an ejecting or lifting force, acting on a body immersed in a liquid or gas, which is equal to the weight of the volume of the liquid or gas displaced by the part of the body immersed in the liquid or gas –Law of Archimedes\n",
        options: {
          minSize: 11,
          maxSize: 120
        }
      }),
      created() {
        window.addEventListener("resize", this.calculateFontSize);
      },
      destroyed() {
        window.removeEventListener("resize", this.calculateFontSize);
      },
      methods: {
        calculateFontSize() {
          //get font size of text and card height
          let fontSize = this.fontSize;
          let textHeight = this.$refs.cardText.clientHeight;
          let cardHeight = this.$refs.card.clientHeight - 50;
    
          //compare card height and text height
          if (textHeight >= cardHeight) {
            this.fontSize = fontSize - 0.1;
          } else if (textHeight < cardHeight) {
            this.fontSize = fontSize + 0.1;
          }
    
          //apply card width and height to category text when resizing window
          this.cardWidth = this.$refs.card.clientWidth;
          this.cardHeight = this.$refs.card.clientHeight;
          this.textWidth = this.$refs.cardText.clientWidth;
          this.textHeight = this.$refs.cardText.clientHeight;
        }
      }
    };
    </script>

    Получаю текущий размер шрифта текста, высоту текста и высоту карточки:
    let fontSize = this.fontSize;
          let textHeight = this.$refs.cardText.clientHeight;
          let cardHeight = this.$refs.card.clientHeight - 50;


    при каждом резайзе окна браузера вызывается метод, который сравнивает, является ли высота текста больше, высоты карточки:
    if (textHeight >= cardHeight) {
            this.fontSize = fontSize - 0.1;
          } else if (textHeight < cardHeight) {
            this.fontSize = fontSize + 0.1;
          }


    Для временной отладки,чтобы посмотреть все размеры:
    this.cardWidth = this.$refs.card.clientWidth;
          this.cardHeight = this.$refs.card.clientHeight;
          this.textWidth = this.$refs.cardText.clientWidth;
          this.textHeight = this.$refs.cardText.clientHeight;
    Ответ написан
    Комментировать