vue.js - 根据用户操作访问 Vuex 状态
问题描述
我正在使用 Nuxt.js 并且正在开发一个 Uploader 组件,我依赖于vue-upload-component 完整示例,基本上我删除了 Edit 功能并实现了 Vuex 进行状态管理,所以:
在数据()
files: this.$store.state.files.files,
在模板中
<file-upload
... others ...
@input-filter="inputFilter"
@input-file="inputFile"
@input="inputUpdate"
ref="upload">
在方法中
inputUpdate(files) {
this.$store.dispatch("files/setFiles", files)
},
每次添加文件时更新状态。
我有一个 files.js 存储模块,其中包含有效的突变、操作和吸气剂,当用户选择文件时,存储会正确更新。
export const state = () => ({
files: []
})
我正在尝试添加自定义编辑功能:1)当用户选择具有适当编辑按钮的文件时,2)我将显示一些允许用户修改所选文件的某些字段的 html 输入
1)
<a :class="{'dropdown-item': true}" href="#" @click.prevent="onEdit(data.item)">Edit</a>
2)
methods:{
...
onEdit(file){
// file.id
}
....
我想了解从商店中选择与用户选择的元素相对应的元素的最佳方法(比较 id)。我想利用 v-for 然后依靠 v-show 仅显示用户选择的内容,但我当前的实现不起作用。
<b-card
v-for="(file, id) in files"
:key="id"
:title="file.name"
:sub-title="file.size"
class="my-5">
</b-card>
解决方案
您应该使用计算而非数据来保持反应性。
computed: {
files () {
return store.state.files.files
}
}
要从存储中选择一个文件,有很多方法可以实现它。
data: {
selectedFile: {}
},
methods:{
onEdit(file){
this.selectedFile = file;
},
cancelEdit(){
this.selectedFile = {};
}
...
}
不要v-for
用来隐藏东西
<b-card
v-if="selectedFile.id"
:title="selectedFile.name"
:sub-title="selectedFile.size"
class="my-5 selected-file">
</b-card>
<b-card
v-else
v-for="(file, id) in files"
:key="id"
:title="file.name"
:sub-title="file.size"
class="my-5 files">
</b-card>
推荐阅读
- java - 使用 Android Studio 创建多个接入点
- c++ - 使用向量时获取 SIGABRT
- javascript - 为什么我用 POST 重新加载到 json-server
- java - SpringBoot2.2.1部署在云服务器上总是无法运行报错“Web server failed to start. Port 9090 is already in use.”
- node.js - 在 MongoDB 中为用户设置限制并每月重置
- html - HTML 文件显示空白屏幕,即使其中包含内容
- css - CSS放大和缩小鼠标单击并向下滚动或向上滚动paga向上或向下滚动时缩放的图像
- python - 在 Python 中实现集合的差异
- python - Django DRF url映射?
- windows - GPGPU线程策略