Vuex ,вынесение в store

144
27 ноября 2018, 22:30

Всем привет,у меня есть вот такой поиск по элементов и получение данных из api в компоненте,не могу понять,как вынести это в экшены стора,хотябы только обращение к api,объясните пожалуйста,и как он должен потом диспачится в компоненте

export default {
  data() {
    return {
      search: '',
      info: null,
      selected: null,
    };
  },
  computed: {
    filteredCars() {
      let result = this.info;
      if (this.search) {
        result = result.filter((item) => {
          if (item.car.make.indexOf(this.search) !== -1
            || item.car.model.indexOf(this.search) !== -1
            || item.car.licensePlate.indexOf(this.search) !== -1
            || item.car.vin.indexOf(this.search) !== -1
            || item.client.clientName.indexOf(this.search) !== -1) {
            return item;
          }
        });
      }
      return result;
    },
  },
  mounted() {
    axios.get('api/v1/contracts', {
      headers: {
        Authorization: `Bearer ${localStorage.getItem('user-token')}`,
      },
    })
      .then(response => (this.info = response.data));
  },
};
Answer 1

Если Вам нужно глобальное состояние, то для этого нужен vuex, если надо только отобразить что-то в одном компоненте, то сойдет так как у Вас написано сейчас.

Если окончательно решили использовать vuex, то создайте state с нужным свойством с которым надо работать:

state: {
  contracts: null // Вы получаете с api
}

И мутацию - только она может менять состояние хранилища:

mutations: {
  setContracts (state, payload) {
    state.contracts = payload
  }
}

Дальше т.к. Вы используете api для получения данных, то нужно создать действие которое записывает contracts

actions: {
  setContracts ({ commit }) {
    axios.get('api/v1/contracts', {
      headers: {
        Authorization: `Bearer ${localStorage.getItem('user-token')}` // не лучшая практика везде повторять встаку хедера авторизации
      },
    }).then(response => {
      // вызывает мутацию
      commit('setContracts', response.data) // нужно создать мутацию setContracts
    });
  }  
}

В компоненте можно вызвать вот так:

mounted () {
  this.$store.dispatch('setContracts')
}

И наконец можете создать геттер, который возвращает отфильтрованные данные:

getters: {
  filteredCars: (state) => (search) => { // такая конструкция потому что надо передать параметр
    let result = state.contracts
    if (search) {
      result = result.filter((item) => {
        if (item.car.make.indexOf(search) !== -1
          || item.car.model.indexOf(search) !== -1
          || item.car.licensePlate.indexOf(search) !== -1
          || item.car.vin.indexOf(search) !== -1
          || item.client.clientName.indexOf(search) !== -1) {
          return item;
        }
      });
    }
    return result;
  }
}

Использование:

  computed: {
    filteredCars () {
      return this.$store.getters.filteredCars(this.serach) // передали строку поиска
    }
  } 

Код не проверял, могут быть мелкие ошибки.

Детальное описание концепций хранилища в офф. документации.

READ ALSO
с какой стороны блока пришла мышь javascript

с какой стороны блока пришла мышь javascript

Подскажите пожалуйста как на чистом javascript реализовать появление фона с определенной стороны при навелении мыши https://wwwcartoonnetwork

134
получить позицию строки по сортировке

получить позицию строки по сортировке

В таблице у каждой стройки есть уникальный текст(id), можно отсортировать строки по разным значениям, как получить расположение строки относительно...

166
Есть gif, как добавить на сайт

Есть gif, как добавить на сайт

Gif весит много, хотелось бы преобразовать во что-то, что не будет слишком конфликтно с разными бразуерами, да и в принцепе хотелось бы узнать,...

201
бордер по ширине текста

бордер по ширине текста

Есть блок в котором есть текст, если слова перенеслись на новую строку, блок стал меньше, нужно чтоб снизу был бордер по ширине текста

148