前言

去年微软开源了 react-native-windows, 支持将 React Native App 跑在 Windows 上。而在近日,其又宣布了支持 MacOS。
为了体验一波,所以使用 cnode 的 API 来写个 Demo 尝尝鲜。

创建项目

  1. 初始化项目并进入根目录
  1. npx react-native init cnodeMac --version 0.61.5
  2. cd cnodeMac
  1. 安装 macOS 拓展
  1. npx react-native-macos-init
  1. 启动项目
  1. npx react-native run-macos

image.png

代码实现

我们使用 cnode 的列表 API 获取数据,渲染一个列表。代码如下:

  1. import React, { useState, useEffect } from 'react';
  2. import {
  3. SafeAreaView,
  4. StyleSheet,
  5. View,
  6. Text,
  7. StatusBar,
  8. FlatList,
  9. Image,
  10. } from 'react-native';
  11. const Item = ({ author, title })=> {
  12. return (
  13. <View style={styles.container}>
  14. <Image style={styles.avatar} source={{ uri: author.avatar_url }} />
  15. <View>
  16. <Text style={styles.title}>{title}</Text>
  17. <Text style={styles.title}>{author.loginname}</Text>
  18. </View>
  19. </View>
  20. );
  21. }
  22. const App = () => {
  23. const [refreshing, setRefreshing] = useState(false);
  24. const [state, setState] = useState({
  25. page: 0,
  26. data: [],
  27. });
  28. const getData = async (isRefresh) => {
  29. setRefreshing(true);
  30. const page = isRefresh ? 1 : state.page + 1;
  31. const response = await fetch(`https://cnodejs.org/api/v1/topics?page=${page}&mdrender=false`);
  32. const { success, data } = await response.json();
  33. if (success) {
  34. setState({
  35. page,
  36. data: [...state.data, ...data],
  37. });
  38. }
  39. setRefreshing(false);
  40. };
  41. useEffect(() => {
  42. getData(true);
  43. }, []);
  44. return (
  45. <>
  46. <StatusBar barStyle="dark-content" />
  47. <SafeAreaView>
  48. <FlatList
  49. refreshing={refreshing}
  50. data={state.data}
  51. keyExtractor={item => item.id}
  52. renderItem={({ item }) => <Item {...item} />}
  53. onRefresh={() => getData(true)}
  54. onEndReached={() => getData()}
  55. />
  56. </SafeAreaView>
  57. </>
  58. );
  59. };
  60. const styles = StyleSheet.create({
  61. container: {
  62. display: 'flex',
  63. flexDirection: 'row',
  64. backgroundColor: '#fff',
  65. padding: 10,
  66. },
  67. avatar: {
  68. width: 50,
  69. height: 50,
  70. marginRight: 10,
  71. },
  72. title: {
  73. fontSize: 14,
  74. },
  75. });
  76. export default App;

预览效果如下:
image.png

体验结果

总体开发过程中,总是会出现一些莫名其妙的异常导致红屏。开发体验较差,所以就只有写了一个简单的列表页。因此,目前还不建议投入正式使用。

结语

随着这两年 Flutter 的火起,React Native 团队也宣布了对 React Native 进行重构,而微软也加入到 React Native 的桌面端的支持中来。对于既有移动端及桌面端的项目,也是多了一种选择。而 React Native 由于使用 JavaScript,对于前端开发者而言,入门成本更低。
早期 React Native 由于一堆坑及其团队维护问题,也遭到诸如 Airbnb 等团队的放弃。React Native 也将在年底完成重构,其新架构对性能等方面的优化,倒也是值得期待。