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

    Комментировать
  • Как понять компонент это или нет в vue?

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

    Например, компонент Button в вашем случае не очень нужен пока, например, не придется этим кнопкам навешивать обработчики событий (которых определенно некоторое конкретное количество).

    Легко понять на примере обычных шаблонов постов любой CMS, они как правило вынесены в отдельный файл. Не всегда понятно где на сайте они используются, но всегда можно наверняка поправить В ОДНОМ МЕСТЕ шаблон поста и быть уверенным, что он поменяется везде.

    Так же и с вашей кнопкой. Вы можете создать компонент Button, зная, что возможно эти кнопки надо будет дополнить какими-то properties, либо изменить структуру самой кнопки.

    Button это слишком простой пример в вашем случае. Вам нужно понимать, что у компонента существуют свои данные, методы, watchers событий и тд. И как только вам что-то из этого понадобится - вы используете компонент.
    Ответ написан
    Комментировать
  • Как правильно строить проект на Vue.js?

    1. Их может быть сколько угодно. Оправдано в тех случаях, когда у вас на сайте в разных местах находится 3 абсолютно разных калькулятора, обрабатываемых vue, и больше ничего.

    2. Если у вас очень просто проект, то нет смысла создавать компонент button, в котором будет находится та же кнопка, с какими-то вашими properties. Компоненты нужны в случае, как сказано у вас, переиспользования. Например у вас компонентом может быть какой-то пост, какой-то комментарий и тд.
    Ответ написан
    Комментировать
  • Выполнять метод через n-интервал времени, но только после первого события?

    Создаете флаг, присваиваете ему false, при первом клике меняете его на true и запускаете интервал.

    примерно так:

    data(){
          return {
            flag: false,
          }
        },
        methods: {
          somefunc(){
                if(this.flag == false) {
                   //do something
                  //то что выполнится в первый раз
                } else {
                   setInterval(func,5000);
                   // то что будет выполняться следующие разы
                }
                this.flag = true;
                
               
            }
          },

    В первый раз она у вас не выполнится. А дальше что-то будет выполняться через интервал. Но это первое что пришло в голову, полагаю способ решения довольно костыльный.
    Ответ написан
    Комментировать
  • Как правильно делать POST запрос с Axios?

    Потому что вы не принимаете ответ от сервера:
    .then((response)=>{
         console.log(response.data);
         this.$router.replace(this.$route.query.redirect || '/tamam')
    })
    Ответ написан
    Комментировать
  • NuxtJS как отобразить html, полученный через json?

    можно так: <div v-html="property"></div>
    Ответ написан
    Комментировать
  • Как показать ошибки в Vue от Laravel Request?

    Вам нужно валидировать ваши данные, которые приходят от клиента.
    public function login(Request $request)
        {
            $credentials = $request->only('email', 'password');
    
            $validator = \Validator::make($credentials, [
              'email' => 'required',
              'password' => 'required',
            ]);
    
            if ($validator->fails()) {
              return response()
                ->json(['errors' => $validator->errors()], 422);
            }
    ....
    }


    Код:
    if ($validator->fails()) {
              return response()
                ->json(['errors' => $validator->errors()], 422);
            }

    Вернет клиенту (в случае ошибки), массив errors, со всеми ошибками, которые возникли.

    У меня это работает так: в Login.vue есть метод, который авторизует пользователя:

    login(){
            var app = this
            var user = this.$auth.login({
                params: {
                  email: app.email,
                  password: app.password
                },
                success: function () {
                  this.$store.dispatch('authuser/loadUserData');
                },
                error: function (err) {
                  app.errors = err.response.data.errors;
                },
                rememberMe: app.remember,
                redirect: '/',
                fetchUser: true,
            });
          },

    data(){
          return {
            email: null,
            password: null,
            errors: {},
            remember: true
          }
        },

    Собственно, если мы получили ошибку, то:
    error: function (err) {
                  app.errors = err.response.data.errors;
                },
    добавляем ошибки в массив ошибок, далее этот массив просто выводим:

    <div v-if="errors" v-for="category in errors">
                    <div class="m-alert m-alert--outline alert alert-danger alert-dismissible" role="alert" v-for="error in category">
                      <span>{{ error }}</span>
                    </div>
                  </div>

    Тут два цикла, так как массив errors из ответа, будет содержать элементы: errors_password, errors_email и тд, каждый из которых является массивом. Но это вы уже сами можете в ответе сервера посмотреть.

    На всякий случай прикрепляю полный файл Login.vue:
    Login.vue
    <template>
      <!-- begin:: Page -->
      <div class="m-grid m-grid--hor m-grid--root m-page">
        <div class="m-grid__item m-grid__item--fluid m-grid m-grid--hor m-login m-login--signin m-login--2 m-login-2--skin-2" id="m_login" style="background-image: url(/assets/app/media/img//bg/bg-3.jpg);">
    
    
          <div class="m-grid__item m-grid__item--fluid	m-login__wrapper">
            <div class="m-login__container">
              <div class="m-login__logo">
                <a href="#">
                  <img src="/assets/demo/demo7/media/img/logo/logo.svg" style="height:70px;">
                </a>
              </div>
              <div class="m-login__signin">
                <div class="m-login__head">
                  <h3 class="m-login__title">
                    Авторизация
                  </h3>
                  <div class="m-login__desc">
                    Заполните данные ниже для авторизации:
                  </div>
                </div>
                <form class="m-login__form m-form" autocomplete="off" @submit.prevent="login" method="post">
    
                  <div v-if="errors" v-for="category in errors">
                    <div class="m-alert m-alert--outline alert alert-danger alert-dismissible" role="alert" v-for="error in category">
                      <span>{{ error }}</span>
                    </div>
                  </div>
    
    
                  <div class="form-group m-form__group">
                    <input type="email" id="email" class="form-control" placeholder="E-mail" v-model="email" required autofocus>
                  </div>
    
                  <div class="form-group m-form__group">
                    <input type="password" id="password" class="form-control" v-model="password" placeholder="Пароль" equired>
                  </div>
                  <div class="row m-login__form-sub">
        						<div class="col m--align-left m-login__form-left">
        							<label class="m-checkbox  m-checkbox--focus m-checkbox--state-accent">
        							<input type="checkbox" name="remember" v-model="remember" checked="checked"> Запомнить меня
        							<span></span>
        							</label>
        						</div>
        						<div class="col m--align-right m-login__form-right">
        							<router-link :to="{ name: 'register'}" id="m_login_forget_password" class="m-link">Забыли пароль?</router-link>
        						</div>
        					</div>
    
                  <div class="m-login__form-action">
                    <button type="submit" class="btn btn-accent m-btn m-btn--pill m-btn--custom m-btn--air  m-login__btn">Авторизоваться</button>
                  </div>
    
    
                </form>
              </div>
              <div class="m-login__account">
                <span class="m-login__account-msg">
                У вас еще нет аккаунта?
                </span>&nbsp;&nbsp;
                <router-link :to="{ name: 'register'}" class="m-link m-link--light m-login__account-link" style="border-bottom: 1px solid #6a6279;">
                  Зарегистировать аккаунт
                </router-link>
              </div>
    
              <div class="m-login__forget-password">
                <div class="m-login__head">
                  <h3 class="m-login__title">
                    Забыли пароль?
                  </h3>
                  <div class="m-login__desc">
                    Укажите Ваш e-mail для восстановления пароля:
                  </div>
                </div>
                <form class="m-login__form m-form" action="">
                  <div class="form-group m-form__group">
                    <input class="form-control m-input" type="text" placeholder="Email" name="email" id="m_email" autocomplete="off">
                  </div>
                  <div class="m-login__form-action">
                    <button id="m_login_forget_password_submit" class="btn btn-focus m-btn m-btn--pill m-btn--custom m-btn--air  m-login__btn m-login__btn--primaryr">
                      Выслать новый
                    </button>
                    &nbsp;&nbsp;
                    <button id="m_login_forget_password_cancel" class="btn btn-outline-focus m-btn m-btn--pill m-btn--custom m-login__btn">
                      Отмена
                    </button>
                  </div>
                </form>
              </div>
            </div>
          </div>
        </div>
      </div>
      <!-- end:: Page -->
    
    </template>
    
    <script>
      import { mapState, mapActions } from 'vuex';
      export default {
        data(){
          return {
            email: null,
            password: null,
            errors: {},
            remember: true
          }
        },
        computed: mapState({
          user: state => state.authuser.user
        }),
        methods: {
          login(){
            var app = this
            var user = this.$auth.login({
                params: {
                  email: app.email,
                  password: app.password
                },
                success: function () {
                  this.$store.dispatch('authuser/loadUserData');
                },
                error: function (err) {
                  app.errors = err.response.data.errors;
                },
                rememberMe: app.remember,
                redirect: '/',
                fetchUser: true,
            });
          },
    
        }
      }
    </script>
    Ответ написан
    5 комментариев
  • Архитектура больших веб-приложений?

    По структуре: https://vueschool.io/articles/vuejs-tutorials/stru...
    Чтобы не смотреть хеллоу ворды, посмотрите примеры работы vuex: https://github.com/vuejs/vuex
    Большинство вопросов возникают по мере увеличения приложения, об этом в гайдах не особо рассказывается (русскоязычных), поэтому смотрите примеры на medium и тд.
    Ответ написан
    Комментировать
  • Как передавать данные именно тому темплейту в котором произошло событие - подгрузить контент?

    Вообще, как мне кажется, вам нужно создать отдельный компонент карточки товара, где вы создаете какой-нибудь метод, например update(), в котором у вас будет происходить запрос на сервер (в качестве параметра вы передаете id товара), получив информацию, записав все нужно в data, карточка у вас обновится. Этот метод вы уже повесите на кнопку обновления информации, например:
    <div class="product__update" @click="update">Обновить информацию</div>


    В самом приложении будете использовать просто вывод карточек, как-то так (перед этим не забудьте список продуктов получить для начала):
    <div v-for="product in products">
          <product :id="product.id" :title="product.title" :image="product.image"></product>
    </div>

    Где products это массив всех товаров, полученных по апи.

    То есть вам требуется создать два компонента: ProductList и Product.
    Ответ написан
    Комментировать
  • Как сделать авто обновление контента vue.js?

    Копайте в сторону web socket
    Ответ написан
    Комментировать
  • В чем проблема и почему?

    Вам же дан явный ответ, что не получается найти элемент #one
    Ответ написан
    4 комментария