Получите данные из хранилища vuex и выберите первый вариант в переменной

#vue.js #axios #vuex

Вопрос:

Каков правильный подход к извлечению данных с помощью (с помощью действий vuex), получению данных и установке первого элемента в качестве выбранного параметра?

То, что у меня есть прямо сейчас, — это AddUser форма с полем выбора для роли. В созданной функции я вызываю функцию fetchRoles, используя vuex, для извлечения доступных ролей из серверной части. Я создал вычисляемое свойство roles , чтобы вернуть роли из хранилища. Наконец, мне нужна локальная selectedRole переменная с первой ролью по умолчанию.

 <script>
    export default {
        created() {
            this.$store.dispatch('roles/fetchRoles');
        },
        computed: {
            roles() {
                return this.$store.getters['roles/roles'];
            },
        },
        data() {
            return {
                selectedRole: this.roles[0],
            };
        },
    };
</script>
 

Поскольку данные выполняются до того, как вычисляются this.roles[0] , не определены. Я могу изменить код на this.roles.length > 0 ? this.roles[0] : null , но переменная не обновляется, когда роли, наконец, доступны. Возможным решением могло бы быть использование свойства часов, но я чувствую, что для этой концепции должен быть лучший подход.

Дополнительный код

Действие fetchRoles

 export async function fetchRoles(context) {
    try {
        if (context.state.roles.length === 0) {
            const response = await axios.get('roles');
            const roles = response.data.roles;
            return await context.commit('setRoles', roles);
        }
    } catch (error) {
        console.log(error);
        return error;
    }
}
 

Мутация setRoles

 export function setRoles(state, roles) {
    state.roles = roles;
}
 

добытчик ролей

 export function roles(state) {
    return state.roles;
}
 

Ответ №1:

Вы можете дождаться fetchRoles действий и назначить свою переменную после;

 async created() {
    await this.$store.dispatch('roles/fetchRoles');
    this.selectedRole = this.roles[0];
}
 
 Vue.config.devtools = false;
Vue.config.productionTip = false;

const store = new Vuex.Store({
  state: {
    posts: null
  },
  actions: {
    async fetchPosts() {
const posts = await fetch('https://jsonplaceholder.typicode.com/posts')
  .then((response) => response.json());
  this.commit('setPosts', posts)
    }
  },
  mutations: {
    setPosts(state, posts) {
      state.posts = posts;
    }
  }
})



var app = new Vue({
  el: '#app',
  store,
  data: {
    firstPost: null
  },
  computed: {
    posts() {
      return this.$store.state.posts;
    }
  },
  async created() {
    await this.$store.dispatch('fetchPosts');
    this.firstPost = this.posts[0];
  }
}) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<script src="https://unpkg.com/vuex@3.1.2/dist/vuex.js"></script>

<div id="app">
  <div v-if="firstPost">
    firstPost : {{ firstPost.title }}
  </div>
  <div v-else>
    Loading...
  </div>
</div> 

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

1. Работаю! Спасибо!