javascript - Vuetify 和 Vuex 商店:无法从商店渲染标题
问题描述
所以在我正在开发的这个应用程序中,我希望允许用户选择在某个数据表中显示的标题,并且这个选择不会在页面更改时丢失。我认为使用 Vuex 存储来缓存标头的状态可能是解决此问题的方法,但我在渲染时遇到了问题。
渲染数据表时,出现以下错误:
TypeError: this.headers.filter is not a function
headersWithCustomFilters webpack-internal:///./node_modules/vuetify/lib/components/VDataTable/VDataTable.js:208
VueJS 3
customFilterWithColumns webpack-internal:///./node_modules/vuetify/lib/components/VDataTable/VDataTable.js:270
filteredItems webpack-internal:///./node_modules/vuetify/lib/components/VData/VData.js:163
VueJS 3
computedItems webpack-internal:///./node_modules/vuetify/lib/components/VData/VData.js:169
VueJS 3
scopedProps webpack-internal:///./node_modules/vuetify/lib/components/VData/VData.js:189
VueJS 3
render webpack-internal:///./node_modules/vuetify/lib/components/VData/VData.js:410
VueJS 14
mounted webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vuetify-loader/lib/loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/legalfile/LegalFileList.vue?vue&type=script&lang=js&:183
promise callback*mounted webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/vuetify-loader/lib/loader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/legalfile/LegalFileList.vue?vue&type=script&lang=js&:182
VueJS 18
mutations webpack-internal:///./src/store/index.js:228
wrappedMutationHandler webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:773
commitIterator webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:411
commit webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:410
_withCommit webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:555
commit webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:409
boundCommit webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:354
actions webpack-internal:///./src/store/index.js:194
wrappedActionHandler webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:780
dispatch webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:461
boundDispatch webpack-internal:///./node_modules/vuex/dist/vuex.esm.js:351
<anonymous> webpack-internal:///./src/router/index.js:865
iterator webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:2159
step webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:1885
step webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:1889
runQueue webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:1893
confirmTransition webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:2186
transitionTo webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:2073
push webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:2404
push webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:2819
handler webpack-internal:///./node_modules/vue-router/dist/vue-router.esm.js:1099
VueJS 2
instrument.js:118:46
这是代码的最小可重现示例:
<template>
<v-data-table
v-model="selectedLegalFiles"
:headers="visibleHeaders"
:items="legalFiles"
:items-per-page="20"
>
</v-data-table>
</template>
<script>
export default {
computed: {
...mapGetters({
filterableHeaders: 'filterableHeaders',
visibleHeaders: 'visibleHeaders',
headersExport: 'headersExport'
}),
visibleHeaders: {
get () {
return this.visibleHeaders
},
set (value) {
this.toggleVisibility(value)
}
}
},
methods: {
...mapMutations({
toggleVisibility: legalFileListSettingsTypes.mutations.toggleVisibility
}),
}
</script>
import types from '@/types/legalfile/legal-file-list-settings'
import _ from 'lodash'
const state = {
headers: [
{ text: 'legal_file.serie', value: 'serie', visible: true }, // tc
{ text: 'common.code', value: 'code', visible: true }, // t
{ text: 'legal_file.subcode', value: 'subcode', visible: true }, // t
{ text: 'common.type', value: 'type', visible: true }, // t
{ text: 'legal_file.class', value: 'legalfile_class', visible: true }, // t
{ text: 'legal_file.phase', value: 'phase', visible: true }, // t
{ text: 'legal_file.responsible', value: 'responsible', visible: true, permission: { action: 'read', module: 'contacts' } }, // t
{ text: 'legal_file.contact_roles', value: 'aux_roles', visible: true, permission: { action: 'read', module: 'contacts' } }, // t
{ text: 'legal_file.court_appointed', value: 'court_appointed', visible: false }, // t
{ text: 'base.created_date', value: 'creation_date', visible: false }, // t
{ text: 'legal_file.other_data.penal.crime_calification', value: 'crime_calification', visible: false }, // t
{ text: 'legal_file.other_data.penal.criminal_record', value: 'criminal_record', visible: false }, // t
{ text: 'common.description', value: 'description', visible: false }, // t
{ text: 'legal_file.other_data.labor.laboral_mediation', value: 'laboral_mediation', visible: false }, // t
{ text: 'legal_file.other_data.penal.law_mediation', value: 'law_mediation', visible: false }, // t
{ text: 'common.state', value: 'state', visible: false }, // t
{ text: 'base.table.actions', value: 'actions', sortable: false, visible: true } // t
]
}
const getters = {
[types.getters.visibleHeaders]: state => state.headers.filter(header => header.visible === true),
[types.getters.filterableHeaders]: state => state.headers.filter(header => header.value !== 'actions'),
[types.getters.headersExport]: state => state.headers.filter(header => header.visible === true && header.value !== 'actions')
}
const mutations = {
[types.mutations.toggleVisibility] (state, value) {
const index = _.findIndex(state.headers, function (o) { return o.value === value })
state.headers[index].visible = !state.headers[index].visible
}
}
export default {
state,
getters,
mutations
}
解决方案
推荐阅读
- php - 获取PHP中第二个下划线后的字符串
- swift - 在包含对象的数组中,更改一项的属性不会更改对象本身
- c# - C# 无法将文本解析为整数?
- java - 无法在基于 Spring XML 的应用程序中访问 PCF 中的 VCAP SERVICES
- go - text/template.Templates 和 html/template.Templates 之间的区别
- javascript - 如何在 redux 中间件中调度一个动作?
- c# - 在 IIS 下运行时无法连接到 Elasticsearch(访问密钥和秘密不被尊重)
- apache-kafka - td-agent fluentd 无法向 Kafka 发送消息
- html - 我想根据用户的输入显示结果而不重新加载页面!(对于 html 中的 Wordpress 网页设计?)
- javascript - 在javascript中更改图表高度和宽度属性