#vue.js #filter #vuejs2 #vuex #computed-properties
#vue.js #Фильтр #vuejs2 #vuex #вычисляемые свойства
Вопрос:
Я хотел бы знать, как с помощью входных данных я могу фильтровать данные, поступающие из вычисляемого свойства.
Моя проблема связана со свойством computed dataFiltered (), где возвращается средство получения, но в качестве параметра используется строка.
Я хотел бы, чтобы через входные данные при написании слова фильтровалась информация.
Home.vue
</template>
<input type="text" :v-model="search" class="form-control" id="search" placeholder="Search..."/>
<div>
<ul v-for="item in dataFiltered" :key="item.id">
<li>{{item}}</li>
</ul>
</div>
</template>
<script>
import {ACTYPE} from '../store/types/actions_types';
import {mapState , mapGetters} from 'vuex';
export default {
name: 'home',
created(){
this.$store.dispatch(ACTYPE.GET_MOVIES);
},
data(){
return{
search: ''
}
},
computed: {
...mapState(['topMovies' , 'loading']),
...mapGetters(['filterData']),
dataFiltered(){
// parameter harcored
return this.filterData("Sp")
}
},
}
</script>
store/getters.js
export const getters = {
TopMovies: (state) =>{
return state.topMovies.map(data =>{
return data
});
},
filterData: (state) => (search) =>{
let query = new RegExp(search , 'i');
console.log(query);
//return state.topMovies.filter(data => data.name === query);
return state.topMovies.filter(data =>{
return data.name.toLowerCase().includes(search.toLowerCase())
})
},
};
Ответ №1:
Прежде всего, ваш :v-model="search"
должен быть просто v-model="search"
. :v-model
привязывает значение к чему-либо.
Во-вторых, я не вижу, чтобы вы передавали search
в компоненте в хранилище Vuex, которое затем применяется в получателях.
Это не тестировалось, и я не думаю, что вам требуется хранилище для этого, чтобы это работало. Максимум, что вам может потребоваться от хранилища, — это извлечь исходные данные с помощью mapGetters
помощника и предположить topMovies
, что в этом случае.
В вашем вычисляемом свойстве все, что вам нужно сделать, это отфильтровать данные с помощью строки поискового запроса.
Например.
computed() {
...mapGetters(["topMovies"]),
filteredData() {
return this.topMovies.filter(movie => movie.name.toLowerCase().includes(this.search.toLowerCase()))
}
}
Комментарии:
1. Привет @Ru Черн Чонг По какой-то причине он показывает мне все данные перед выполнением запроса. Когда я выполняю запрос, данные фильтруются. Нет способа не показывать никаких данных, пока запрос не будет добавлен в поиск?
2. Это возможно, означает, что вы должны сохранить поисковый запрос в хранилище и сначала отфильтровать его непосредственно в средствах получения, прежде чем вызывать его в вашем компоненте.