点击选择资产按钮时,打开弹框资产列表,选中资产,切换分页时,使选中的状态不会消失,确定后,添加到表格中,再次点击资产按钮打开弹框,使之前选中的,保持禁用且选中,分页的也禁用和选中
点击选择资产按钮时,打开弹框资产列表,选中资产,切换分页时,使选中的状态不会消失,确定后,添加到表格中,再次点击资产按钮打开弹框,使之前选中的,保持禁用且选中,分页的也禁用和选中
点击选择资产按钮时,打开弹框资产列表,选中资产,切换分页时,使选中的状态不会消失,确定后,添加到表格中,再次点击资产按钮打开弹框,使之前选中的,保持禁用且选中,分页的也禁用和选中
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
7条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
要实现这个功能,你需要在Vue项目中创建一个组件,包括两个部分:主页面和弹出框。这里是一个简化的示例,展示了如何实现这些需求。
首先,在你的
src/components
目录下创建一个新的文件,例如AssetSelector.vue
,然后将以下代码粘贴进去:<template> <div> <button @click="openModal">选择资产</button> <asset-modal ref="assetModal" :selectedAssets.sync="selectedAssets"></asset-modal> <table> <thead> <tr> <th>植被资产名称</th> <th>植被资产种类</th> <th>植被资产数量</th> <th>区域位置</th> <th>覆盖面积 (m²)</th> <th>碳吸收量</th> </tr> </thead> <tbody> <tr v-for="(asset, index) in selectedAssets" :key="index"> <td>{{ asset.name }}</td> <td>{{ asset.category }}</td> <td>{{ asset.quantity }}</td> <td>{{ asset.regionPosition }}</td> <td>{{ asset.coverageArea }}</td> <td>{{ asset.carbonAbsorption }}</td> </tr> </tbody> </table> </div> </template> <script> import AssetModal from './AssetModal.vue'; export default { components: { AssetModal, }, data() { return { selectedAssets: [], }; }, methods: { openModal() { this.$refs.assetModal.open(); }, }, }; </script>
接下来,创建一个名为
AssetModal.vue
的文件,用于显示资产列表和分页:<template> <transition name="fade"> <div class="modal" v-if="isOpen"> <div class="modal-content"> <h2>选择资产</h2> <input type="text" placeholder="Q 搜索" v-model="searchQuery" /> <button @click="resetSearch">C 重置</button> <ul> <li v-for="(asset, index) in filteredAssets" :key="index" :class="{ 'active': isSelected(asset), 'disabled': isCurrentPageDisabled(asset) }" @click="selectAsset(asset)" > {{ asset.name }} </li> </ul> <nav> <ul class="pagination"> <li v-for="page in totalPages" :key="page" :class="{ active: currentPage === page }"> <a href="#" @click="goToPage(page)">{{ page }}</a> </li> </ul> </nav> <button @click="confirmSelection">确定</button> </div> </div> </transition> </template> <script> export default { props: { selectedAssets: { type: Array, required: true }, }, data() { return { isOpen: false, searchQuery: '', currentPage: 1, assetsPerPage: 10, }; }, computed: { filteredAssets() { return this.assets.filter((asset) => { const query = this.searchQuery.toLowerCase(); return asset.name.toLowerCase().includes(query); }).slice( (this.currentPage - 1) * this.assetsPerPage, this.currentPage * this.assetsPerPage ); }, totalPages() { return Math.ceil(this.totalAssetsCount / this.assetsPerPage); }, totalAssetsCount() { return this.selectedAssets.length; }, }, methods: { open() { this.isOpen = true; }, close() { this.isOpen = false; this.searchQuery = ''; }, selectAsset(asset) { if (!this.isSelected(asset)) { this.selectedAssets.push(asset); } }, resetSearch() { this.searchQuery = ''; }, goToPage(page) { if (page > 0 && page <= this.totalPages) { this.currentPage = page; } }, confirmSelection() { this.close(); // 如果你想更新父组件的数据,可以使用$emit('update:selectedAssets', this.selectedAssets) }, isSelected(asset) { return this.selectedAssets.includes(asset); }, isCurrentPageDisabled(asset) { return !isSelected(asset) || this.currentPage !== 1; }, }, }; </script> <style scoped> .modal { display: none; position: fixed; z-index: 1; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(0, 0, 0, 0.4); } .fade-enter-active, .fade-leave-active { transition: opacity 0.5s ease; } .fade-enter, .fade-leave-to { opacity: 0; } </style>
在这个例子中,我们创建了一个名为
AssetModal
的组件,它接收一个名为selectedAssets
的属性,该属性是双向绑定的。当用户在弹出框中选择资产并点击确定后,它们会被添加到父组件的selectedAssets
数组中。同时,我们还实现了搜索、分页和禁用已选择项的功能。为了更好地理解这个例子,你需要将其整合到你的Vue项目中,并确保已经安装了Vue Router和其他依赖项。这只是一个基础示例,可能需要根据你的实际需求进行调整。如果你有任何疑问或需要进一步的帮助,请随时告诉我。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 网站设计与开发职业技能大赛试题
- ¥20 在使用CESM2.2.0模型进行case.submit过程中出现如下错误(关键词-Map)
- ¥15 有办法改变通过wifi进入的网站的设置吗
- ¥15 所以到底怎么算!算到凌晨五点都算不出来!
- ¥15 label_studio
- ¥15 请教如何phython发邮件
- ¥15 linux系统安装问题
- ¥15 路径规划如何采用矢量法让他们尽量在一个方向
- ¥15 crypto 一道rsa解密题
- ¥15 survIDINRI已将生存时间转为数值变量,仍错误 Time variable is not numeric。