【React Natve】NetworkError 和 TouchableOpacity 组件

NetworkError公共组件

复制代码
import SimpleLineIcons from "@expo/vector-icons/SimpleLineIcons";
import { StyleSheet, Text, View } from "react-native";

export default function NetworkError() {
  return (
    <View style={styles.container}>
      <SimpleLineIcons name={"drawer"} size={160} color={"#ddd"} />
      <Text style={styles.title}>抱歉,网络连接出错了!</Text>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
  title: {
    color: "#999",
  },
});

import { useEffect, useState } from "react";
import { StyleSheet, Text, View } from "react-native";
import NetworkError from "./components/shared/NetworkError";

export default function App() {
  const [courses, setCourses] = useState([]);
  const [keyword, setKeyword] = useState("");
  const [error, setError] = useState(false);

  /**
   * 获取搜索接口课程数据
   * @returns { Promise<void> }
   */
  const fetchData = async () => {
    try {
      const res = await fetch(`http://192.168.1.138/search?q=${keyword}`);
      const { data } = await res.json();
      setCourses(data.courses);
      console.log("获取到的数据是:", data.courses);
    } catch (error) {
      console.error("获取数据失败:", error);
      setError(true);
    }
  };

  useEffect(() => {
    fetchData();
  }, []);

  return (
    <View style={styles.container}>
      {error ? (
        <NetworkError />
      ) : (
        <>
          {courses.map((course) => (
            <Text key={course.id}>{course.name}</Text>
          ))}
        </>
      )}
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#fff",
    alignItems: "center",
    justifyContent: "center",
  },
  input: {
    height: 40,
    width: 300,
    margin: 12,
    padding: 10,
    borderWidth: 1,
    borderColor: "#ccc",
    borderRadius: 5,
  },
});

然后我们把后端服务停掉,然后接口请求肯定会报错,直接进入我们的自定义错误处理:

这里使用到的图标,都是 rn 内置的,无需安装,以下是使用方法和所有的图标:

https://docs.expo.dev/guides/icons/

https://oblador.github.io/react-native-vector-icons/

TouchableOpacity 组件

Button组件在iOSAndroid上的UI是不一致的。可以改用TouchableOpacity组件来开发。

这是一个点击后可以改变透明度的组件,与它类似的还有组件:

这三个组件,使用方式都是一样的,只是在点击后,显示的有点小区别而已。

打开NetworkError.js,来引用一下:

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

然后到提示信息下面,使用它:

复制代码
<TouchableOpacity style={styles.reload} onPress={onReload}>
  <Text style={styles.label}>重新加载</Text>
</TouchableOpacity>
  • 用起来非常简单,直接用它,包住Text组件就行了。

打开App,按钮的样子已经出来了。这个按钮,点击它,按住不放的时候,它会有个透明度的改变。

这里有一个需要注意点,onPress={onReload} onReload 要么直接写,要么写成箭头函数的形式 () => onReload() 。因为如果写成 onReload() 是函数的直接调用,不论是否点击,都会直接执行。所以,简写为 onReload ,需要传参时写为箭头函数。

相关推荐
2501_920931701 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
layman05282 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔2 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李2 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN2 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒2 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库2 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052472 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
晓晓莺歌2 小时前
vue3某一个路由切换,导致所有路由页面均变成空白页
前端·vue.js
Up九五小庞2 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源