返回顶部
首页 > 资讯 > 精选 >React Native Popup怎么实现
  • 682
分享到

React Native Popup怎么实现

2023-06-30 14:06:06 682人浏览 独家记忆
摘要

这篇文章主要介绍“React Native Popup怎么实现”,在日常操作中,相信很多人在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,            },          },          <TouchableOpacity onPress={onPress}>            <View style={styles.triangle} />            <View style={{ ...styles.content, ...style }} {...other}>              {content}            </View>          </TouchableOpacity>,        )}    </>  );};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,            },          },          <TouchableOpacity onPress={onPress}>            <View style={styles.triangle} />            <View style={{ ...styles.content, ...style }} {...other}>              {content}            </View>          </TouchableOpacity>,        )}    </>  );};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 />    </>  );};
  • 使用全局变量控制。

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

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

--结束END--

本文标题: React Native Popup怎么实现

本文链接: https://lsjlt.com/news/329647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • React Native Popup怎么实现
    这篇文章主要介绍“React Native Popup怎么实现”,在日常操作中,相信很多人在React Native Popup怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希...
    99+
    2023-06-30
  • react native路由跳转怎么实现
    本教程操作环境:Windows10系统、React Native0.67版、Dell G3电脑。react native路由跳转怎么实现?React Native-路由跳转搭建完RN开发环境后,要实现多个页面之间的跳转。 1.这时需要安装r...
    99+
    2023-05-14
    react-native
  • React Native中怎么实现动态导入
    这篇文章主要介绍“React Native中怎么实现动态导入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“React Native中怎么实现动态导入”文章能帮助大家解决问题。背景...
    99+
    2023-07-02
  • 怎么使用react native reanimated实现动画
    这篇“怎么使用react native reanimated实现动画”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2023-07-05
  • React Native react-navigation导航怎么用
    这篇文章将为大家详细讲解有关React Native react-navigation导航怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、开源库介绍Fb推荐使用库...
    99+
    2024-04-02
  • 如何实现react-native聊天室
    这篇文章将为大家详细讲解有关如何实现react-native聊天室,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言最近都沉浸在react native原生app开发...
    99+
    2024-04-02
  • React Native如何实现Flexbox布局
    这篇文章给大家分享的是有关React Native如何实现Flexbox布局的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex 是 Flexible Box 的缩写,意为”弹...
    99+
    2024-04-02
  • 怎么用react native实现圆弧拖动进度条
    这篇“怎么用react native实现圆弧拖动进度条”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用react nat...
    99+
    2023-06-05
  • React-Native中props怎么用
    这篇文章将为大家详细讲解有关React-Native中props怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。props就是属性,是为了描述一个组件的特征而存在的。...
    99+
    2024-04-02
  • 如何实现React Native屏幕适配
    这篇文章给大家分享的是有关如何实现React Native屏幕适配的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。屏幕适配的前置知识RN 中的尺寸单位为 dp,而设计稿中的单位为 ...
    99+
    2024-04-02
  • react native路由跳转如何实现
    这篇文章主要讲解了“react native路由跳转如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react native路由跳转如何实现”吧!react native路由跳转的实现...
    99+
    2023-07-04
  • react-native消息推送实现方式
    目录react-native极光推送一、安装插件二、配置安卓配置IOS配置三、使用解决ios角标无法清除总结react-native极光推送 先去官网注册:https://www.j...
    99+
    2023-02-18
    react-native消息推送 react-native 消息推送
  • React Native 中实现倒计时功能
    目录正文首次实现最终实现示例正文 在 React Native,该如何实现一个倒计时功能呢? 首次实现 表面看来很简单,譬如像下面这样: const timer = useRef&...
    99+
    2022-11-13
    React Native倒计时 React Native
  • 使用react native 怎么实现一个微信聊天室
    本篇文章给大家分享的是有关使用react native 怎么实现一个微信聊天室,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。、技术点MVVM框...
    99+
    2024-04-02
  • react+native+adb报错怎么办
    本教程操作环境:Windows10系统、React Native0.67版、Dell G3电脑。react+native+adb报错怎么办?react-native在win10下用adb报错的解决方案react-native在WIN10上面...
    99+
    2023-05-14
    adb react-native
  • react native 怎么捕捉错误
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react native 怎么捕捉错误?React Native错误捕捉与处理经常使用发行包进行测试的开发者们可能会发现,在发行版本中,如果出现了脚本错误...
    99+
    2023-05-14
    react-native
  • react native怎么隐藏组件
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react native 中如何对组件进行隐藏?具体问题描述:如何通过A中的switchAndroid的value来控制B模块的显示和隐藏呢显示全部问题解...
    99+
    2023-05-14
    组件 react-native
  • react native reanimated实现动画示例详解
    目录背景动画拆分实现抖动定义动画实现缩放动画改变内容Reanimated 原理浅析总结背景 在一次 App 迭代中,UI 想要给按钮添加一个动画效果,在对接的过程中,UI 表示直接...
    99+
    2023-03-06
    react native reanimated 动画 react native reanimated
  • react-native实现渐变色背景过程
    目录react-native 渐变色背景react-native学习记录滚动条轮播图示例渐变色ScrollableTabView默认页面ScrollableTabView背景颜色Sc...
    99+
    2024-04-02
  • React-Native组件之Modal怎么用
    这篇文章将为大家详细讲解有关React-Native组件之Modal怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Modal组件可以用来覆盖包含React Nati...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作