Задать вопрос
Ответы пользователя по тегу Vue.js
  • Почему не передаются данные через Vuex?

    @Orfen
    import Vue from 'vue';
    import Vuex from 'vuex';
    import kakoitoModule from "./modules/kakoitoModule";
    Vue.use(Vuex);
    
    const store = new Vuex.Store({
      modules: {
        kakoitoModule
      }
    });


    //kakoitoModule.js
    const namespaced = true;
    const state = {
        preloader: true,
    };
    
    const getters = {};
    
    const mutations = {
          disablePreloader(state) {
              state.preloader = false;
           },
    };
    const actions = {};
    export default {namespaced, state, getters, mutations, actions}
    Ответ написан
    Комментировать
  • Сгенерировать форму из JSON на vue js?

    @Orfen
    Сделай свои компоненты под каждый тип поля : 1. my-text-field component 2.my-select component 3. radio component. В my-text-field могут быть props, например: rules, validate, autocomplete, которые позволят расширить компонент и придумать фичи. Теперь про эвенты. Например, компонент my-text-field, в нем в data создаешь value: null. Вешаешь watch на этот инпут, а в методе вотчера кидаешь внутренний эвент компоненту выше.

    Пример, как бросить эвент родительскому компоненту :
    //ChildLolComponent
    methods:{
         lol(){
               this.$emit('lolEvent', this.lol)
          }
    }


    Пример, как поймать эвент поймать эвент в родительском компоненте:
    //ParentLolComponent
         <lol @lolEvent="название_вашего_метода_для_принятия_данных" />


    Теперь про родительский компонент.
    Создай компонент base-form, в нем укажи props с названием formFields. Туда передай массив объектов, где каждый объект это поле.
    Например объект под
    formFields: [
     {
        name: 'my_field',
        class: 'moi_class',
        type: 'input',
        component: 'my-text-field'
        id: 'moi_id',
      }
    ];


    Вот, в props это все дело передал, распарсил как тебе надо в created() методе компонента ( ну подготовил данные как тебе под вывод). Ну а дальше идешь в base-form.vue, там делаешь что-то подобное:

    //this.$emit(changeData, value) -- предположим эвент будет называть changeData
    <div v-for="field in parsedFields"> 
          <component :is="field.component" @changeData="НАЗВАНИЕ_МЕТОДА_КОТОРЫЙ_БУДЕТ_ПРИНИМАТЬ_В_СЕБЕ_ЗНАЧЕНИЕ"> 
    </div>


    Постарался примерно объяснить, времени особо нет, чтобы долго объяснять, надеюсь примерно понял, если нужна будет помощь - пиши.)
    Ответ написан
    Комментировать
  • Vue - как правильно организовать структуру компонентов?

    @Orfen
    Используй slot, slot-scope пиши компоненты, которые друг от друга не зависят (модальное окно)
    https://ru.vuejs.org/v2/guide/components-slots.html
    Ответ написан
    Комментировать
  • Как организовать разделы сайта на Vue?

    @Orfen
    Смотри.
    Если ты делаешь фронт на ларавеле, а не под ларавел, то пусть будут перезагрузки, а уж если ты решил полноценное SPA приложение, почему бы не делать его отдельно? Сделай API на Laravel, поставь JWTAuth для Laravel и будет тебе счастье.

    Будешь с фронта кидать запрос на авторизацию, тебе будет приходить токен, будешь его сохранять в localStorage.
    Подключаешь Axios, после авторизации в Headers засовываешь access_token, складываешь в API роуты в группу с мидлвейром под JWTAuth и все.

    Во Vue-Router используешь beforeEach, для проверок всяких. Например делаешь firstEnter для beforeEach.
    Создаешь модуль для Vuex, store, у которого в state будет first_enter = true/false. Тем самым можешь при авторизации регулировать, загружать тебе все настройки у пользователя заново или нет.

    // login.js
    export default{
         data(){
              return {
                  login: '',
                  pass: '',
                }
         }
         methods:{
              auth(){
                  axios.post(api_root + '/login')
                        .then(res => {
                              if(res.data.access_token){
                                  Vue.localStorage.set('access_token', res.data.access_token);   
                                  this.$store.commit('app/set_first_enter', true);                        
                              }
                        })         
              }
         }
    }


    // app.store.js
    const state = {
              first_enter: true,
    }
    
    const mutations = {
         set_first_enter(state, payload){
              state.first_enter = !!payload;
         },
    
         exit(state,payload){
               state.first_enter = true;
         }
    };
    
    const actions = {}
    const namespaced = {}
    
    export default {namespaced, state, getters, mutations, actions}


    //router.js
    import VueRouter from 'vue-router';
    import router from './routes'  //роуты
    
    const router = new VueRouter({
    	mode: 'history',
    	routes: routes,
    });
    
    router.beforeEach((to,from,next) => {
         //Здесь все проверки нужные, например есть ли в локалсторадже токен или нет 
    });
    
    export default router;
    Ответ написан
    1 комментарий
  • Как вывести массив в Vuejs полученый от Laravel?

    @Orfen
    Попробуй $transactions не складывать в $array.
    И там где передаешь :transactions, добавь для этого пропса sync (т.е :transactions.sync=transactions)

    И да, в transaction-item, укажи в модуле:
    // Item.js
    export default{
        props:{
             transactions:{
                   type: Array,
                   default: []
             }
        }
    }

    //Item.vue
    <template>
    <div>
      <div class="item" v-for="item in transactions">
    {{ item.recipient.login }}
      </div>
    </div>
    </template>
    <script src="./Item.js"></script>


    Как-то так должно выглядеть
    Ответ написан
    Комментировать