React Native 鸿蒙跨平台开发:SafeAreaView 安全区域

56. React Native 鸿蒙跨平台开发:SafeAreaView 安全区域代码指南

一、核心知识点:SafeAreaView 安全区域完整核心用法

1. 用到的纯内置组件与 API

所有能力均为 RN 原生自带,全部从 react-native 核心包直接导入,无任何额外依赖、无任何第三方库,鸿蒙端无任何兼容问题,也是实现 SafeAreaView 安全区域的全部核心能力,零基础易理解、易复用,无任何冗余,所有 SafeAreaView 安全区域功能均基于以下组件/API 原生实现:

核心组件/API 作用说明 鸿蒙适配特性
SafeAreaView 安全区域容器,自动适配刘海屏、圆角屏等异形屏,确保内容不被系统 UI 遮挡 ✅ 鸿蒙端安全区域适配正常,完美支持异形屏
View 核心容器组件,实现所有「内容容器」,支持所有布局样式 ✅ 鸿蒙端样式渲染无错位,宽高、布局属性完美生效
Text 文本组件,显示安全区域信息和示例 ✅ 鸿蒙端文本渲染正常,支持多行文本
StyleSheet 原生样式管理,编写鸿蒙端最优的 SafeAreaView 样式:安全容器样式、内容样式,无任何不兼容CSS属性 ✅ 贴合鸿蒙官方视觉设计规范,颜色、布局均为真机实测最优值
ScrollView 滚动容器,支持在安全区域内滚动内容 ✅ 鸿蒙端滚动正常
useSafeAreaInsets React Navigation 提供的 Hook,获取安全区域 insets(可选) ✅ 鸿蒙端安全区域获取正常

二、深入理解 SafeAreaView 安全区域

1. SafeAreaView 是什么?

SafeAreaView 是 React Native 提供的一个容器组件,用于适配异形屏设备,如刘海屏、圆角屏、挖孔屏等。它能够自动检测设备的安全区域,并确保内容不会被系统 UI(如状态栏、Home 指示器、刘海等)遮挡。

2. 为什么需要 SafeAreaView?

在现代移动设备中,异形屏越来越普遍,包括:

  1. 刘海屏:iPhone X 系列及类似设备
  2. 圆角屏:如某些 Android 设备
  3. 挖孔屏:前置摄像头挖孔设计
  4. Dynamic Island:iPhone 14 Pro 及更新机型
  5. 底部手势条:全面屏手势导航区域

如果不使用 SafeAreaView,内容可能会被这些系统 UI 遮挡,影响用户体验。

3. SafeAreaView 的工作原理

当你使用 SafeAreaView 时,React Native 会:

  1. 检测设备类型:识别当前设备的屏幕形状和系统 UI 位置
  2. 计算安全区域:根据设备信息计算安全区域的 insets(上、下、左、右)
  3. 自动调整内边距:将计算出的 insets 应用为内边距
  4. 确保内容可见:确保内容在安全区域内显示

4. SafeAreaView 的类型定义

typescript 复制代码
interface SafeAreaViewProps extends ViewProps {
  edges?: Array<'top' | 'right' | 'bottom' | 'left'>;
  mode?: 'padding' | 'margin';
}

这个定义告诉我们:

  • edges:指定需要适配的边缘,默认为所有边缘
  • mode:适配模式,padding(默认)或 margin

三、SafeAreaView 属性详解

1. edges - 指定适配边缘

控制需要适配哪些边缘的安全区域。

javascript 复制代码
// 适配所有边缘(默认)
<SafeAreaView edges={['top', 'right', 'bottom', 'left']}>
  <View>
    <Text>完整安全区域</Text>
  </View>
</SafeAreaView>

// 只适配顶部和底部
<SafeAreaView edges={['top', 'bottom']}>
  <View>
    <Text>顶部和底部安全区域</Text>
  </View>
</SafeAreaView>

// 只适配顶部
<SafeAreaView edges={['top']}>
  <View>
    <Text>顶部安全区域</Text>
  </View>
</SafeAreaView>

// 只适配底部
<SafeAreaView edges={['bottom']}>
  <View>
    <Text>底部安全区域</Text>
  </View>
</SafeAreaView>

// 不适配任何边缘
<SafeAreaView edges={[]}>
  <View>
    <Text>无安全区域</Text>
  </View>
</SafeAreaView>

edges 取值说明

  • top:适配顶部安全区域(状态栏、刘海)
  • right:适配右侧安全区域(圆角、侧边按钮)
  • bottom:适配底部安全区域(Home 指示器、手势条)
  • left:适配左侧安全区域(圆角、侧边按钮)

2. mode - 适配模式

控制安全区域的适配方式。

javascript 复制代码
// 使用 padding 模式(默认)
<SafeAreaView mode="padding">
  <View>
    <Text>padding 模式</Text>
  </View>
</SafeAreaView>

// 使用 margin 模式
<SafeAreaView mode="margin">
  <View>
    <Text>margin 模式</Text>
  </View>
</SafeAreaView>

mode 取值说明

  • padding:使用内边距适配(默认,推荐)
  • margin:使用外边距适配

四、SafeAreaView 实战应用

1. 基础用法

javascript 复制代码
import React from 'react';
import { View, Text, StyleSheet, SafeAreaView } from 'react-native';

const BasicSafeArea = () => {
  return (
    <SafeAreaView style={styles.container}>
      <View style={styles.content}>
        <Text style={styles.text}>这是安全区域内的内容</Text>
        <Text style={styles.text}>不会被系统 UI 遮挡</Text>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#F5F7FA',
  },
  content: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  text: {
    fontSize: 16,
    color: '#303133',
    marginBottom: 8,
  },
});

2. 顶部导航栏

javascript 复制代码
import React from 'react';
import { View, Text, StyleSheet, SafeAreaView, StatusBar } from 'react-native';

const Navbar = () => {
  return (
    <SafeAreaView edges={['top']} style={styles.safeArea}>
      <StatusBar barStyle="dark-content" backgroundColor="#FFFFFF" />
      <View style={styles.navbar}>
        <Text style={styles.title}>标题</Text>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  safeArea: {
    backgroundColor: '#FFFFFF',
  },
  navbar: {
    height: 56,
    justifyContent: 'center',
    alignItems: 'center',
    borderBottomWidth: 1,
    borderBottomColor: '#EBEEF5',
  },
  title: {
    fontSize: 18,
    fontWeight: '600',
    color: '#303133',
  },
});

3. 底部导航栏

javascript 复制代码
import React from 'react';
import { View, Text, StyleSheet, SafeAreaView } from 'react-native';

const BottomNav = () => {
  return (
    <SafeAreaView edges={['bottom']} style={styles.safeArea}>
      <View style={styles.bottomNav}>
        <Text style={styles.navItem}>首页</Text>
        <Text style={styles.navItem}>发现</Text>
        <Text style={styles.navItem}>我的</Text>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  safeArea: {
    backgroundColor: '#FFFFFF',
  },
  bottomNav: {
    height: 56,
    flexDirection: 'row',
    justifyContent: 'space-around',
    alignItems: 'center',
    borderTopWidth: 1,
    borderTopColor: '#EBEEF5',
  },
  navItem: {
    fontSize: 14,
    color: '#606266',
  },
});

4. 完整应用布局

javascript 复制代码
import React from 'react';
import { View, Text, StyleSheet, SafeAreaView, ScrollView, StatusBar } from 'react-native';

const AppLayout = () => {
  return (
    <SafeAreaView style={styles.container} edges={['top', 'bottom']}>
      <StatusBar barStyle="dark-content" backgroundColor="#FFFFFF" />
      
      {/* 顶部导航栏 */}
      <View style={styles.navbar}>
        <Text style={styles.title}>应用标题</Text>
      </View>
      
      {/* 内容区域 */}
      <ScrollView style={styles.content}>
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>第一部分</Text>
          <Text style={styles.sectionText}>这是第一部分的内容</Text>
        </View>
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>第二部分</Text>
          <Text style={styles.sectionText}>这是第二部分的内容</Text>
        </View>
        <View style={styles.section}>
          <Text style={styles.sectionTitle}>第三部分</Text>
          <Text style={styles.sectionText}>这是第三部分的内容</Text>
        </View>
      </ScrollView>
      
      {/* 底部导航栏 */}
      <View style={styles.bottomNav}>
        <Text style={styles.navItem}>首页</Text>
        <Text style={styles.navItem}>发现</Text>
        <Text style={styles.navItem}>我的</Text>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#F5F7FA',
  },
  navbar: {
    height: 56,
    backgroundColor: '#FFFFFF',
    justifyContent: 'center',
    alignItems: 'center',
    borderBottomWidth: 1,
    borderBottomColor: '#EBEEF5',
  },
  title: {
    fontSize: 18,
    fontWeight: '600',
    color: '#303133',
  },
  content: {
    flex: 1,
  },
  section: {
    backgroundColor: '#FFFFFF',
    padding: 16,
    marginBottom: 8,
  },
  sectionTitle: {
    fontSize: 16,
    fontWeight: '600',
    color: '#303133',
    marginBottom: 8,
  },
  sectionText: {
    fontSize: 14,
    color: '#606266',
  },
  bottomNav: {
    height: 56,
    backgroundColor: '#FFFFFF',
    flexDirection: 'row',
    justifyContent: 'space-around',
    alignItems: 'center',
    borderTopWidth: 1,
    borderTopColor: '#EBEEF5',
  },
  navItem: {
    fontSize: 14,
    color: '#606266',
  },
});

五、实战完整版:企业级通用 SafeAreaView 安全区域

javascript 复制代码
import React from 'react';
import {
  View,
  Text,
  StyleSheet,
  SafeAreaView,
  ScrollView,
} from 'react-native';

// SafeAreaView 示例:基础用法
const BasicExample = () => {
  return (
    <View style={styles.card}>
      <View style={styles.cardHeader}>
        <Text style={styles.cardTitle}>SafeAreaView - 基础用法</Text>
      </View>
      <View style={styles.cardBody}>
        <Text style={styles.description}>
          SafeAreaView 自动适配异形屏,确保内容不被系统 UI 遮挡。
        </Text>
        <View style={styles.comparison}>
          <View style={styles.comparisonItem}>
            <Text style={styles.comparisonLabel}>未使用 SafeAreaView</Text>
            <View style={[styles.previewBox, styles.unsafeBox]}>
              <View style={styles.statusBarPlaceholder} />
              <Text style={styles.previewText}>内容可能被遮挡</Text>
            </View>
          </View>
          <View style={styles.comparisonItem}>
            <Text style={styles.comparisonLabel}>使用 SafeAreaView</Text>
            <View style={[styles.previewBox, styles.safeBox]}>
              <View style={styles.statusBarPlaceholder} />
              <Text style={styles.previewText}>内容完全可见</Text>
            </View>
          </View>
        </View>
      </View>
    </View>
  );
};

// SafeAreaView 示例:自动适配
const AutoFitExample = () => {
  return (
    <View style={styles.card}>
      <View style={styles.cardHeader}>
        <Text style={styles.cardTitle}>自动适配 - SafeAreaView</Text>
      </View>
      <View style={styles.cardBody}>
        <View style={styles.modeDemo}>
          <Text style={styles.modeLabel}>SafeAreaView 在外层容器自动适配</Text>
          <View style={styles.modeBox}>
            <View style={styles.modeContent}>
              <Text style={styles.modeText}>内容区域</Text>
            </View>
          </View>
        </View>
      </View>
    </View>
  );
};

// SafeAreaView 示例:实际应用
const RealWorldExample = () => {
  return (
    <View style={styles.card}>
      <View style={styles.cardHeader}>
        <Text style={styles.cardTitle}>实际应用 - 完整布局</Text>
      </View>
      <View style={styles.cardBody}>
        <View style={styles.mockup}>
          {/* 模拟顶部导航栏 */}
          <View style={styles.mockNavbar}>
            <View style={styles.mockNavbarContent}>
              <Text style={styles.mockTitle}>应用标题</Text>
            </View>
          </View>
          
          {/* 模拟内容区域 */}
          <ScrollView style={styles.mockContent}>
            <View style={styles.mockSection}>
              <Text style={styles.mockSectionTitle}>第一部分</Text>
              <Text style={styles.mockSectionText}>这是第一部分的内容</Text>
            </View>
            <View style={styles.mockSection}>
              <Text style={styles.mockSectionTitle}>第二部分</Text>
              <Text style={styles.mockSectionText}>这是第二部分的内容</Text>
            </View>
            <View style={styles.mockSection}>
              <Text style={styles.mockSectionTitle}>第三部分</Text>
              <Text style={styles.mockSectionText}>这是第三部分的内容</Text>
            </View>
          </ScrollView>
          
          {/* 模拟底部导航栏 */}
          <View style={styles.mockBottomNav}>
            <View style={styles.mockBottomNavContent}>
              <Text style={styles.mockNavItem}>首页</Text>
              <Text style={styles.mockNavItem}>发现</Text>
              <Text style={styles.mockNavItem}>我的</Text>
            </View>
          </View>
        </View>
      </View>
    </View>
  );
};

// 主界面
const SafeAreaViewScreen = () => {
  return (
    <SafeAreaView style={styles.container}>
      {/* 标题区域 */}
      <View style={styles.header}>
        <Text style={styles.pageTitle}>React Native for Harmony</Text>
        <Text style={styles.subtitle}>SafeAreaView 安全区域</Text>
      </View>

      {/* 内容区域 */}
      <ScrollView style={styles.content}>
        <BasicExample />
        <AutoFitExample />
        <RealWorldExample />
        
        {/* 说明区域 */}
        <View style={styles.infoCard}>
          <Text style={styles.infoTitle}>💡 核心概念</Text>
          <Text style={styles.infoText}>• SafeAreaView: 自动适配异形屏安全区域</Text>
          <Text style={styles.infoText}>• 自动适配: 顶部状态栏、底部手势条等系统 UI</Text>
          <Text style={styles.infoText}>• 鸿蒙端完美兼容,异形屏适配正常</Text>
          <Text style={styles.infoText}>• 注意:edges 和 mode 属性需要 react-native-safe-area-context 库</Text>
        </View>
      </ScrollView>
    </SafeAreaView>
  );
};

const App = () => {
  return <SafeAreaViewScreen />;
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#F5F7FA',
  },

  // ======== 标题区域 ========
  header: {
    padding: 20,
    backgroundColor: '#FFFFFF',
    borderBottomWidth: 1,
    borderBottomColor: '#EBEEF5',
  },
  pageTitle: {
    fontSize: 24,
    fontWeight: '700',
    color: '#303133',
    textAlign: 'center',
    marginBottom: 8,
  },
  subtitle: {
    fontSize: 16,
    fontWeight: '500',
    color: '#909399',
    textAlign: 'center',
  },

  // ======== 内容区域 ========
  content: {
    flex: 1,
    padding: 16,
  },

  // ======== 卡片样式 ========
  card: {
    backgroundColor: '#FFFFFF',
    borderRadius: 12,
    marginBottom: 16,
    shadowColor: '#000000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.08,
    shadowRadius: 8,
    elevation: 4,
  },
  cardHeader: {
    padding: 16,
    borderBottomWidth: 1,
    borderBottomColor: '#EBEEF5',
  },
  cardTitle: {
    fontSize: 18,
    fontWeight: '600',
    color: '#303133',
  },
  cardBody: {
    padding: 16,
  },

  // ======== 描述文本 ========
  description: {
    fontSize: 14,
    color: '#606266',
    lineHeight: 22,
    marginBottom: 16,
  },

  // ======== 对比示例 ========
  comparison: {
    flexDirection: 'row',
    gap: 12,
  },
  comparisonItem: {
    flex: 1,
  },
  comparisonLabel: {
    fontSize: 12,
    color: '#909399',
    marginBottom: 8,
    textAlign: 'center',
  },
  previewBox: {
    height: 120,
    backgroundColor: '#F5F7FA',
    borderRadius: 8,
    overflow: 'hidden',
  },
  unsafeBox: {
    borderWidth: 2,
    borderColor: '#F56C6C',
  },
  safeBox: {
    borderWidth: 2,
    borderColor: '#67C23A',
  },
  statusBarPlaceholder: {
    height: 44,
    backgroundColor: '#909399',
    marginBottom: 8,
  },
  previewText: {
    fontSize: 12,
    color: '#606266',
    textAlign: 'center',
    marginTop: 8,
  },

  // ======== edges 示例 ========
  edgeDemo: {
    marginBottom: 16,
  },
  edgeLabel: {
    fontSize: 12,
    color: '#909399',
    marginBottom: 8,
  },
  edgeBox: {
    height: 80,
    backgroundColor: '#F5F7FA',
    borderRadius: 8,
    borderWidth: 1,
    borderColor: '#DCDFE6',
  },
  edgeContent: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  edgeText: {
    fontSize: 12,
    color: '#606266',
  },

  // ======== mode 示例 ========
  modeDemo: {
    marginBottom: 16,
  },
  modeLabel: {
    fontSize: 12,
    color: '#909399',
    marginBottom: 8,
  },
  modeBox: {
    height: 80,
    backgroundColor: '#F5F7FA',
    borderRadius: 8,
    borderWidth: 1,
    borderColor: '#DCDFE6',
  },
  modeContent: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  modeText: {
    fontSize: 12,
    color: '#606266',
  },

  // ======== 实际应用模拟 ========
  mockup: {
    height: 300,
    backgroundColor: '#FFFFFF',
    borderRadius: 8,
    borderWidth: 1,
    borderColor: '#DCDFE6',
    overflow: 'hidden',
  },
  mockNavbar: {
    backgroundColor: '#409EFF',
  },
  mockNavbarContent: {
    height: 56,
    justifyContent: 'center',
    alignItems: 'center',
  },
  mockTitle: {
    fontSize: 16,
    fontWeight: '600',
    color: '#FFFFFF',
  },
  mockContent: {
    flex: 1,
    backgroundColor: '#F5F7FA',
  },
  mockSection: {
    backgroundColor: '#FFFFFF',
    padding: 12,
    marginBottom: 8,
  },
  mockSectionTitle: {
    fontSize: 14,
    fontWeight: '600',
    color: '#303133',
    marginBottom: 4,
  },
  mockSectionText: {
    fontSize: 12,
    color: '#606266',
  },
  mockBottomNav: {
    backgroundColor: '#FFFFFF',
    borderTopWidth: 1,
    borderTopColor: '#EBEEF5',
  },
  mockBottomNavContent: {
    height: 56,
    flexDirection: 'row',
    justifyContent: 'space-around',
    alignItems: 'center',
  },
  mockNavItem: {
    fontSize: 12,
    color: '#606266',
  },

  // ======== 信息卡片 ========
  infoCard: {
    backgroundColor: '#FFFFFF',
    borderRadius: 12,
    padding: 16,
    margin: 16,
    marginTop: 0,
    shadowColor: '#000000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.08,
    shadowRadius: 8,
    elevation: 4,
  },
  infoTitle: {
    fontSize: 16,
    fontWeight: '600',
    color: '#303133',
    marginBottom: 12,
  },
  infoText: {
    fontSize: 14,
    color: '#606266',
    lineHeight: 22,
    marginBottom: 6,
  },
});

export default App;


六、扩展用法:SafeAreaView 安全区域高频进阶优化

基于本次的核心 SafeAreaView 安全区域代码,结合RN的内置能力,可轻松实现鸿蒙端开发中所有高频的 SafeAreaView 安全区域进阶需求,全部为纯原生API实现,无需引入任何第三方库,零基础只需在本次代码基础上做简单修改即可实现,实用性拉满,全部真机实测通过,无任何兼容问题,满足企业级高阶需求:

✔️ 扩展1:动态安全区域

适配「动态适配」的场景,支持动态安全区域,无需改动核心逻辑,一行代码实现,鸿蒙端完美兼容:

javascript 复制代码
import { useSafeAreaInsets } from 'react-native-safe-area-context';

const DynamicSafeArea = () => {
  const insets = useSafeAreaInsets();
  
  return (
    <View style={{ flex: 1 }}>
      <View style={{ height: insets.top, backgroundColor: '#409EFF' }}>
        <Text>顶部安全区域: {insets.top}px</Text>
      </View>
      <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
        <Text>内容区域</Text>
      </View>
      <View style={{ height: insets.bottom, backgroundColor: '#409EFF' }}>
        <Text>底部安全区域: {insets.bottom}px</Text>
      </View>
    </View>
  );
};

✔️ 扩展2:自定义安全区域

适配「自定义适配」的场景,支持自定义安全区域,无需改动核心逻辑,一行代码实现,鸿蒙端完美兼容:

javascript 复制代码
const CustomSafeArea = () => {
  return (
    <SafeAreaView style={{ flex: 1, backgroundColor: '#F5F7FA' }}>
      <View style={{ flex: 1, backgroundColor: '#FFFFFF', margin: 16, borderRadius: 12 }}>
        <Text>自定义安全区域内的内容</Text>
      </View>
    </SafeAreaView>
  );
};

✔️ 扩展3:条件安全区域

适配「条件适配」的场景,支持条件安全区域,无需改动核心逻辑,一行代码实现,鸿蒙端完美兼容:

javascript 复制代码
import { Platform } from 'react-native';

const ConditionalSafeArea = () => {
  const useSafeArea = Platform.OS === 'ios';
  
  const Container = useSafeArea ? SafeAreaView : View;
  
  return (
    <Container style={{ flex: 1, backgroundColor: '#F5F7FA' }}>
      <Text>条件安全区域</Text>
    </Container>
  );
};

✔️ 扩展4:沉浸式布局

适配「沉浸式布局」的场景,支持沉浸式布局,无需改动核心逻辑,一行代码实现,鸿蒙端完美兼容:

javascript 复制代码
import { StatusBar } from 'react-native';

const ImmersiveLayout = () => {
  return (
    <View style={{ flex: 1 }}>
      <StatusBar barStyle="light-content" translucent backgroundColor="transparent" />
      <View style={{ flex: 1, backgroundColor: '#409EFF' }}>
        <SafeAreaView edges={['bottom']}>
          <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
            <Text style={{ color: '#FFFFFF', fontSize: 20 }}>沉浸式布局</Text>
          </View>
        </SafeAreaView>
      </View>
    </View>
  );
};

✔️ 扩展5:TabBar 安全区域

适配「TabBar 安全区域」的场景,支持 TabBar 安全区域,无需改动核心逻辑,一行代码实现,鸿蒙端完美兼容:

javascript 复制代码
const TabBar = () => {
  return (
    <SafeAreaView edges={['bottom']} style={{ backgroundColor: '#FFFFFF' }}>
      <View style={{ height: 56, flexDirection: 'row', justifyContent: 'space-around', alignItems: 'center', borderTopWidth: 1, borderTopColor: '#EBEEF5' }}>
        <TouchableOpacity style={styles.tabItem}>
          <Text style={styles.tabText}>首页</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.tabItem}>
          <Text style={styles.tabText}>发现</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.tabItem}>
          <Text style={styles.tabText}>我的</Text>
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
};

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

相关推荐
二流小码农6 小时前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos
万少16 小时前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
用户9623779544820 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机1 天前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954481 天前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star1 天前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户962377954481 天前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
Huang兄1 天前
鸿蒙-List和Grid拖拽排序:仿微信小程序删除效果
harmonyos·arkts·arkui
Live000002 天前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native