千家信息网

React Native Popup怎么实现

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要介绍"React Native Popup怎么实现",在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2025年02月23日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安全错误 数据库的锁怎样保障安全 哪些方面会运用到数据库 群体感应淬灭数据库 梦幻手游服务器等级78囤什么 海阳微信公众号软件开发推荐 天融信服务器硬件 大学生网络安全防范意识调查 用电脑做可以在ie找到的服务器 网页的服务器错误 汽车软件开发编程有哪些专业 机关单位网络安全培训视频 网络安全信息管理的论文 网络安全管理及实用技术课后题 网络技术有哪些岗位职责 菲律宾鸿利集团软件开发 网络安全工程师培训机构 电信天翼云服务器价格 原神怎么下两个服务器 计算机网络安全问题解答 网上网络安全法考试的目的 达梦数据库unity 上海专业网络技术商家 怎么把数据库导入server 高并发数据库数据安全 系统管理不能登陆服务器 民政职业技术学院软件开发 宁波东方网络技术有限公司 服务器机柜安装教程视频 内网开发阿里云数据库 徐汇区数据库安防系统技术 小学生与网络安全小视屏
0