千家信息网

React Native Popup怎么实现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"React Native Popup怎么实现",在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2026年10月31日React Native Popup怎么实现

这篇文章主要介绍"React Native Popup怎么实现",在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"React Native Popup怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

React Native 官方提供了 Modal 组件,但 Modal 是属于全屏的弹出层,当 Modal 显示时,操作区域只有 Modal 里的元素,而且焦点会被 Modal 劫持。虽然移动端不常见,但有些场景还是希望可以用轻量级一点的 Popup。

在 React Native 里,元素的层级是不可以被穿透的,子元素无论如何都不能遮挡父元素。所以选择了在顶层添加 Popup,设置绝对定位,显示时根据指定元素来动态调整 Popup 的位置的方案。

具体实现

Popup 会有显示或隐藏两种状态,使用一个 state 来控制。

const Component = () => {  const [visible, setVisible] = useState(false);    return (    <>      {visible && <>}      );};

Popup 的 属于视图类组件,UI 结构包括:

  • 一个作为容器的 View,由于 iOS 有刘海,所以在 iOS 上需要使用 SafeAreaView 来避免被刘海遮挡。同时添加一个点击事件监听当点击时关闭 Popup 。

  • 一个指向目标对象的三角形。

  • 一个包裹内容的 View。

由于 Popup 的位置和内容是动态的,所以需要两个 state 存储相关数据。

  • 一个存储位置相关的 CSS。

  • 一个存储动态内容。

const Component = ({ style, ...other }) => {  const [visible, setVisible] = useState(false);  const [popupStyle, setPopupStyle] = useState({});  const [content, setContent] = useState(null);    const onPress = useCallback(() => {    setVisible(false);  }, []);    return (    <>      {visible &&        createElement(          Platform.OS === 'ios' ? SafeAreaView : View,          {            style: {              ...styles.popup,              ...popupStyle,            },          },                                                {content}                      ,        )}      );};const styles = StyleSheet.create({  popup: {    position: 'absolute',    zIndex: 99,    shadowColor: '#333',    shadowOpacity: 0.12,    shadowOffset: { width: 2 },    borderRadius: 4,  },  triangle: {    width: 0,    height: 0,    marginLeft: 12,    borderLeftWidth: 8,    borderLeftColor: 'transparent',    borderRightWidth: 8,    borderRightColor: 'transparent',    borderBottomWidth: 8,    borderBottomColor: 'white',  },  content: {    backgroundColor: 'white',  },});

因为是全局的 Popup,所以选择了一个全局变量来提供 Popup 相关的操作方法。

如果全局 Popup 不适用,可以改成在需要时插入 Popup 并使用 ref 来提供操作方法。

目标元素,动态内容和一些相关的可选配置都是在调用 show 方法时通过参数传入的,

useEffect(() => {  global.$popup = {    show: (triggerRef, render, options = {}) => {      const { x: offsetX = 0, y: offsetY = 0 } = options.offset || {};      triggerRef.current.measure((x, y, width, height, left, top) => {        setPopupStyle({          top: top + height + offsetY,          left: left + offsetX,        });        setContent(render());        setVisible(true);      });    },    hide: () => {      setVisible(false);    },  };}, []);

完整代码

import React, {  createElement,  forwardRef,  useState,  useEffect,  useCallback,} from 'react';import PropTypes from 'prop-types';import {  View,  SafeAreaView,  Platform,  TouchableOpacity,  StyleSheet,} from 'react-native';const Component = ({ style, ...other }, ref) => {  const [visible, setVisible] = useState(false);  const [popupStyle, setPopupStyle] = useState({});  const [content, setContent] = useState(null);  const onPress = useCallback(() => {    setVisible(false);  }, []);  useEffect(() => {    global.$popup = {      show: (triggerRef, render, options = {}) => {        const { x: offsetX = 0, y: offsetY = 0 } = options.offset || {};        triggerRef.current.measure((x, y, width, height, left, top) => {          setPopupStyle({            top: top + height + offsetY,            left: left + offsetX,          });          setContent(render());          setVisible(true);        });      },      hide: () => {        setVisible(false);      },    };  }, []);  return (    <>      {visible &&        createElement(          Platform.OS === 'ios' ? SafeAreaView : View,          {            style: {              ...styles.popup,              ...popupStyle,            },          },                                                {content}                      ,        )}      );};Component.displayName = 'Popup';Component.prototype = {};const styles = StyleSheet.create({  popup: {    position: 'absolute',    zIndex: 99,    shadowColor: '#333',    shadowOpacity: 0.12,    shadowOffset: { width: 2 },    borderRadius: 4,  },  triangle: {    width: 0,    height: 0,    marginLeft: 12,    borderLeftWidth: 8,    borderLeftColor: 'transparent',    borderRightWidth: 8,    borderRightColor: 'transparent',    borderBottomWidth: 8,    borderBottomColor: 'white',  },  content: {    backgroundColor: 'white',  },});export default forwardRef(Component);

使用方法

  • 在入口文件页面内容的末尾插入 Popup 元素。

    // App.jsximport Popup from './Popup';const App = () => {  return (    <>      ...            );};
  • 使用全局变量控制。

    // 显示$popup.show();// 隐藏$popup.hide();

到此,关于"React Native Popup怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

元素 内容 方法 全局 动态 学习 位置 存储 变量 更多 目标 组件 帮助 控制 选择 接下来 无论如何 三角形 两个 使用方法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会 互联网科技行业发展 互联网科技保险 互联网科技有限公司图片 高科技与互联网 广州宏创互联网科技 极限挑战互联网科技 壹账通互联网科技 长亮科技 互联网金融 互联网科技实习生岗位职责 互联网系的金融科技公司 湖南诚度互联网科技有限公司 互联网校园科技培训 银川新华互联网科技学校联系电话 互联网科技的全部知识 中科明德北京互联网科技 南通创西澳互联网科技有限公司 科技信息时代互联网发展 互联网领先科技成果宣传视频 北京瑞云互联网科技有限公司 互联网科技有限公司 A股互联网金融科技公司 互联网科技金融公司 上海万想互联网科技 深圳期待互联网科技 互联网科技有限公司 翻译 广西互联网科技孵化中心 广州千川互联网科技有限公司 云鲸互联网络科技有限公司 互联网科技创业计划的风险分析
0