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

React函数式组件实现分屏页面及项目文件组织咨询

React 函数式组件实现左右分栏地图+视频页面方案

左右分栏布局参考示例

核心页面实现

直接用Flex布局做左右分栏,所有交互逻辑按模块拆分到独立组件里,代码如下:
首先是页面父组件,负责分栏布局和跨组件状态共享:

// src/pages/MapVideoSplitPage/index.jsx
import { useState } from 'react';
import InteractiveMap from '@/components/InteractiveMap';
import VideoPlayer from '@/components/VideoPlayer';
import './index.css';

export default function MapVideoSplitPage() {
  // 存放需要在地图、视频间联动的共享状态,比如选中的监控点对应视频地址
  const [linkedData, setLinkedData] = useState(null);

  return (
    <div className="split-container">
      <div className="left-pane">
        <InteractiveMap onPointSelect={setLinkedData} />
      </div>
      <div className="right-pane">
        <VideoPlayer playConfig={linkedData} />
      </div>
    </div>
  );
}

对应的分栏样式文件,直接占满整个视口,无多余边距:

/* src/pages/MapVideoSplitPage/index.css */
html, body, #root {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
}

.split-container {
  display: flex;
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

.left-pane {
  flex: 1;
  height: 100%;
  border-right: 1px solid #eee;
}

.right-pane {
  flex: 1;
  height: 100%;
  background: #000;
}

两个子组件的编写注意事项:

  • InteractiveMap组件:根据你用的地图服务商选对应的React封装库即可,比如用Mapbox选react-map-gl、高德地图选@uiw/react-amap、Leaflet选react-leaflet,所有地图缩放、打点、路径绘制、区域选择这类交互逻辑全部封装在组件内部,不要把地图相关逻辑堆在父页面。
  • VideoPlayer组件:不管是播本地MP4文件、直播流还是接入第三方视频平台SDK,所有播放控制、进度条、清晰度切换这类逻辑都封装在组件内部,只有需要和地图联动的参数通过父组件props传入即可。

如果需要做移动端适配,只要加一段媒体查询,小屏下自动改成上下分栏,不需要改动组件逻辑:

@media (max-width: 768px) {
  .split-container {
    flex-direction: column;
  }
  .left-pane {
    border-right: none;
    border-bottom: 1px solid #eee;
  }
}

该场景推荐的项目文件组织方式

不要一开始就搞过度复杂的架构,按功能拆分、方便维护就行,推荐目录结构如下:

your-project/
├── public/                # 静态资源,存地图标记图标、静态视频文件这类
├── src/
│   ├── pages/             # 页面级组件
│   │   └── MapVideoSplitPage/  # 当前分栏页面的独立目录
│   │       ├── index.jsx        # 父页面分栏逻辑
│   │       └── index.css        # 分栏布局样式
│   ├── components/        # 可跨页面复用的通用组件
│   │   ├── InteractiveMap/ # 通用地图组件,其他页面需要地图直接引入
│   │   │   ├── index.jsx
│   │   │   ├── config.js  # 单独存放地图key、自定义样式配置
│   │   │   └── useMapControls.js # 自定义hook,封装打点、缩放等复用交互逻辑
│   │   └── VideoPlayer/   # 通用视频播放器组件
│   │       ├── index.jsx
│   │       └── controls/  # 播放器自定义控件,比如音量键、进度条
│   ├── hooks/             # 全局通用自定义hook,比如响应式判断、数据请求逻辑
│   ├── utils/             # 通用工具函数,比如地图坐标转换、视频地址拼接
│   ├── App.jsx
│   └── main.jsx
└── package.json

几个新手容易踩的坑:

  • 不要把地图、视频的所有逻辑全堆在同一个jsx文件里,后期改交互找代码会非常麻烦,不用一开始拆的特别细,哪个部分逻辑超过200行就单独抽成文件就行。
  • 地图和视频的联动状态统一放在父页面维护,遵循React单向数据流规则,不要在两个子组件里直接互相传值,排查bug会简单很多。
  • 地图、视频这类SDK加载的时候注意做销毁处理,组件卸载的时候记得调用SDK的销毁方法,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:27:33