You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Peoplesoft Peoplecode:子页面网格选中行转主页面网格实现方案咨询

子页面选中行同步到主页面Grid的实现方案

下面是几种实用的实现方式,你可以根据页面架构(单页/多页、弹窗/独立页面)选择:

1. 全局状态管理(单页应用首选)

如果是Vue、React这类单页应用,用全局状态管理工具最省心:

  • 在全局状态(比如Pinia、Vuex、Redux)里定义一个数组来存选中行
  • 子页面点击「Add to form」时,把选中行提交到全局状态,记得加去重逻辑,避免重复添加相同行
  • 主页面的Grid直接绑定这个全局状态数组,状态更新时Grid会自动渲染新数据

示例(以Pinia为例):

// 定义全局状态仓库
import { defineStore } from 'pinia'
export const useSelectedRowsStore = defineStore('selectedRows', {
  state: () => ({ rows: [] }),
  actions: {
    addRows(newRows) {
      // 按唯一ID去重
      const existingIds = this.rows.map(row => row.id)
      const uniqueRows = newRows.filter(row => !existingIds.includes(row.id))
      this.rows.push(...uniqueRows)
    }
  }
})

// 子页面按钮点击逻辑
import { useSelectedRowsStore } from '@/stores/selectedRows'
const store = useSelectedRowsStore()
const handleAdd = () => {
  const selectedRows = gridInstance.getSelectedRows() // 假设Grid有获取选中行的方法
  store.addRows(selectedRows)
  // 关闭子页面/弹窗
}

// 主页面Grid绑定数据
import { useSelectedRowsStore } from '@/stores/selectedRows'
const store = useSelectedRowsStore()
// 直接用store.rows作为Grid的数据源

2. 父子组件通信(弹窗/嵌套子组件场景)

如果子页面是主页面弹出的弹窗或者嵌套组件,直接用父子通信更简单:

  • 主页面打开子页面时,传给子组件一个回调函数
  • 子页面点击按钮时,调用这个回调,把选中行数据传回去
  • 主页面收到数据后,合并到自己的Grid数据源(同样要去重)

示例(Vue弹窗场景):

<!-- 主页面 -->
<template>
  <ChildModal @add-rows="handleAddRows" />
  <MainGrid :data="mainGridData" />
</template>
<script setup>
import { ref } from 'vue'
const mainGridData = ref([])
const handleAddRows = (newRows) => {
  const existingIds = mainGridData.value.map(row => row.id)
  const uniqueRows = newRows.filter(row => !existingIds.includes(row.id))
  mainGridData.value = [...mainGridData.value, ...uniqueRows]
}
</script>

<!-- 子页面弹窗 -->
<template>
  <button @click="submitSelected">Add to form</button>
  <SubGrid ref="subGrid" />
</template>
<script setup>
import { ref } from 'vue'
const emit = defineEmits(['add-rows'])
const subGrid = ref(null)
const submitSelected = () => {
  const selectedRows = subGrid.value.getSelectedRows()
  emit('add-rows', selectedRows)
}
</script>

3. 浏览器本地存储(跨独立页面场景)

如果主页面和子页面是完全独立的页面(比如新开标签页),用localStorage/sessionStorage临时存数据:

  • 子页面点击按钮时,把选中行转成JSON字符串存到本地存储,可以先合并已有数据再存储
  • 主页面监听storage事件,一旦存储内容变化就读取数据更新Grid
  • 用完记得清理存储,避免残留数据

示例:

// 子页面点击逻辑
const handleAdd = () => {
  const selectedRows = gridInstance.getSelectedRows()
  const existingRows = JSON.parse(localStorage.getItem('selectedRows')) || []
  const existingIds = existingRows.map(row => row.id)
  const uniqueRows = selectedRows.filter(row => !existingIds.includes(row.id))
  localStorage.setItem('selectedRows', JSON.stringify([...existingRows, ...uniqueRows]))
  window.close()
}

// 主页面监听与初始化
window.addEventListener('storage', (e) => {
  if (e.key === 'selectedRows') {
    const selectedRows = JSON.parse(e.newValue) || []
    mainGridData = selectedRows // 更新Grid数据源
    localStorage.removeItem('selectedRows') // 清理存储
  }
})
// 页面加载时检查一次存储
window.addEventListener('load', () => {
  const selectedRows = JSON.parse(localStorage.getItem('selectedRows')) || []
  if (selectedRows.length) {
    mainGridData = selectedRows
    localStorage.removeItem('selectedRows')
  }
})

4. URL参数传递(小数据量场景)

如果选中行数据量很小,用URL参数传递也可行:

  • 子页面把选中行转成JSON字符串,编码后拼到主页面URL的参数里
  • 主页面读取URL参数,解析后更新Grid
  • 缺点:URL长度有限制,数据多了会失效

示例:

// 子页面跳转逻辑
const handleAdd = () => {
  const selectedRows = gridInstance.getSelectedRows()
  const encodedData = encodeURIComponent(JSON.stringify(selectedRows))
  window.location.href = `/main-page?selected=${encodedData}`
}

// 主页面读取参数
window.addEventListener('load', () => {
  const params = new URLSearchParams(window.location.search)
  const selectedData = params.get('selected')
  if (selectedData) {
    const selectedRows = JSON.parse(decodeURIComponent(selectedData))
    mainGridData = selectedRows // 更新Grid数据源
    // 移除URL参数,避免刷新重复加载
    window.history.replaceState({}, document.title, window.location.pathname)
  }
})

内容的提问来源于stack exchange,提问作者Pat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:45:05