{"id":259,"date":"2026-09-19T10:13:08","date_gmt":"2026-09-19T02:13:08","guid":{"rendered":"https:\/\/yykcj.com\/?p=259"},"modified":"2026-09-19T10:13:08","modified_gmt":"2026-09-19T02:13:08","slug":"react-native-%e8%b7%a8%e5%b9%b3%e5%8f%b0%e5%bc%80%e5%8f%91%e5%ae%9e%e6%88%98%ef%bc%9a%e4%bb%8e%e7%8e%af%e5%a2%83%e6%90%ad%e5%bb%ba%e5%88%b0%e5%8f%8c%e7%ab%af%e5%8f%91%e5%b8%83","status":"publish","type":"post","link":"https:\/\/yykcj.com\/?p=259","title":{"rendered":"React Native \u8de8\u5e73\u53f0\u5f00\u53d1\u5b9e\u6218\uff1a\u4ece\u73af\u5883\u642d\u5efa\u5230\u53cc\u7aef\u53d1\u5e03"},"content":{"rendered":"<h2>\u4e3a\u4ec0\u4e48\u9009\u62e9 React Native\uff1f<\/h2>\n<p>\u5728\u79fb\u52a8\u7aef\u5f00\u53d1\u9886\u57df\uff0c\u8de8\u5e73\u53f0\u65b9\u6848\u4e00\u76f4\u5907\u53d7\u5173\u6ce8\u3002React Native\uff08RN\uff09\u51ed\u501f\u5176\u300cLearn once, write anywhere\u300d\u7684\u7406\u5ff5\uff0c\u5141\u8bb8\u5f00\u53d1\u8005\u4f7f\u7528 JavaScript \u548c React \u6784\u5efa\u771f\u6b63\u7684\u539f\u751f\u5e94\u7528\uff0c\u540c\u65f6\u4fdd\u6301\u63a5\u8fd1\u539f\u751f\u7684\u6027\u80fd\u4f53\u9a8c\u3002<\/p>\n<p>\u672c\u6587\u5c06\u4ee5\u4e00\u4e2a\u5f85\u529e\u4e8b\u9879\uff08TodoList\uff09\u5e94\u7528\u4e3a\u4f8b\uff0c\u5e26\u4f60\u4ece\u96f6\u5f00\u59cb\u5b8c\u6210\u4e00\u4e2a\u53ef\u8fd0\u884c\u5728 iOS \u548c Android \u4e0a\u7684\u8de8\u5e73\u53f0\u5e94\u7528\uff0c\u5e76\u5206\u4eab\u5b9e\u9645\u5f00\u53d1\u4e2d\u7684\u6700\u4f73\u5b9e\u8df5\u4e0e\u5e38\u89c1\u9677\u9631\u3002<\/p>\n<h2>\u73af\u5883\u642d\u5efa\uff1a\u907f\u5f00\u65b0\u624b\u5751<\/h2>\n<h3>1. \u5b89\u88c5 Node \u4e0e Watchman<\/h3>\n<p>\u9996\u5148\u786e\u4fdd Node.js \u7248\u672c >= 16\u3002\u63a8\u8350\u4f7f\u7528 nvm \u7ba1\u7406 Node \u7248\u672c\uff1a<\/p>\n<pre><code class=\"language-bash\">\nnvm install 18\nnvm use 18\n<\/code><\/pre>\n<p>macOS \u7528\u6237\u5efa\u8bae\u5b89\u88c5 Watchman \u4ee5\u63d0\u5347\u6587\u4ef6\u76d1\u542c\u6027\u80fd\uff1a<\/p>\n<pre><code class=\"language-bash\">\nbrew install watchman\n<\/code><\/pre>\n<h3>2. \u5b89\u88c5 React Native CLI<\/h3>\n<p>\u5b98\u65b9\u63a8\u8350\u4f7f\u7528 <code>npx react-native init<\/code> \u6216 Expo\u3002\u672c\u6587\u9009\u62e9\u7eaf RN CLI\uff0c\u4ee5\u4fbf\u66f4\u7075\u6d3b\u5730\u96c6\u6210\u539f\u751f\u6a21\u5757\u3002<\/p>\n<pre><code class=\"language-bash\">\nnpx react-native@latest init TodoApp --version 0.72.6\ncd TodoApp\n<\/code><\/pre>\n<p>> \ud83d\udca1 \u6ce8\u610f\uff1aRN \u7248\u672c\u8fed\u4ee3\u5feb\uff0c\u5efa\u8bae\u9501\u5b9a\u4e00\u4e2a\u7a33\u5b9a\u7248\u672c\uff08\u5982 0.72.x\uff09\uff0c\u907f\u514d\u56e0\u7248\u672c\u4e0d\u517c\u5bb9\u5bfc\u81f4\u6784\u5efa\u5931\u8d25\u3002<\/p>\n<h3>3. iOS \u73af\u5883\u914d\u7f6e<\/h3>\n<ul>\n<li>\u5b89\u88c5 Xcode\uff08\u6700\u65b0\u7248\uff09\u5e76\u540c\u610f\u8bb8\u53ef\u534f\u8bae\uff1a<code>sudo xcodebuild -license accept<\/code><\/li>\n<li>\u5b89\u88c5 CocoaPods\uff1a<code>sudo gem install cocoapods<\/code><\/li>\n<li>\u8fdb\u5165 ios \u76ee\u5f55\u5b89\u88c5\u4f9d\u8d56\uff1a<code>cd ios && pod install<\/code><\/li>\n<\/ul>\n<h3>4. Android \u73af\u5883\u914d\u7f6e<\/h3>\n<ul>\n<li>\u5b89\u88c5 JDK 17\uff08RN 0.72 \u8981\u6c42\uff09<\/li>\n<li>\u4e0b\u8f7d Android Studio\uff0c\u5b89\u88c5 SDK Platform 33 \u548c Build-Tools 33.0.0<\/li>\n<li>\u914d\u7f6e\u73af\u5883\u53d8\u91cf\uff1a<\/li>\n<\/ul>\n<pre><code class=\"language-bash\">\nexport ANDROID_HOME=$HOME\/Library\/Android\/sdk\nexport PATH=$PATH:$ANDROID_HOME\/emulator\nexport PATH=$PATH:$ANDROID_HOME\/tools\nexport PATH=$PATH:$ANDROID_HOME\/tools\/bin\nexport PATH=$PATH:$ANDROID_HOME\/platform-tools\n<\/code><\/pre>\n<p>> \u26a0\ufe0f \u5e38\u89c1\u5751\uff1aWindows \u7528\u6237\u9700\u786e\u4fdd Hyper-V \u6216 Intel HAXM \u5df2\u5f00\u542f\uff0c\u5426\u5219\u6a21\u62df\u5668\u65e0\u6cd5\u542f\u52a8\u3002<\/p>\n<h2>\u9879\u76ee\u7ed3\u6784\u8bbe\u8ba1<\/h2>\n<p>\u4e00\u4e2a\u6e05\u6670\u7684\u76ee\u5f55\u7ed3\u6784\u80fd\u6781\u5927\u63d0\u5347\u53ef\u7ef4\u62a4\u6027\u3002\u6211\u4eec\u91c7\u7528\u5982\u4e0b\u7ec4\u7ec7\u65b9\u5f0f\uff1a<\/p>\n<pre><code>\nsrc\/\n  components\/    # \u53ef\u590d\u7528 UI \u7ec4\u4ef6\n  screens\/       # \u9875\u9762\u7ec4\u4ef6\n  navigation\/    # \u5bfc\u822a\u914d\u7f6e\n  store\/         # \u72b6\u6001\u7ba1\u7406\n  utils\/         # \u5de5\u5177\u51fd\u6570\n  services\/      # API \u670d\u52a1\nApp.tsx\n<\/code><\/pre>\n<h2>\u6838\u5fc3\u529f\u80fd\u5b9e\u73b0<\/h2>\n<h3>1. \u72b6\u6001\u7ba1\u7406\uff1a\u4f7f\u7528 Zustand \u66ff\u4ee3 Redux<\/h3>\n<p>\u5bf9\u4e8e\u4e2d\u5c0f\u578b\u5e94\u7528\uff0cZustand \u66f4\u8f7b\u91cf\u4e14\u6613\u4e8e\u4e0a\u624b\u3002\u5b89\u88c5\uff1a<\/p>\n<pre><code class=\"language-bash\">\nnpm install zustand\n<\/code><\/pre>\n<p>\u521b\u5efa store\uff1a<\/p>\n<pre><code class=\"language-typescript\">\n\/\/ src\/store\/todoStore.ts\nimport { create } from &#x27;zustand&#x27;;\n\ninterface Todo {\n  id: string;\n  text: string;\n  completed: boolean;\n}\n\ninterface TodoState {\n  todos: Todo[];\n  addTodo: (text: string) =&gt; void;\n  toggleTodo: (id: string) =&gt; void;\n  removeTodo: (id: string) =&gt; void;\n}\n\nexport const useTodoStore = create&lt;TodoState&gt;((set) =&gt; ({\n  todos: [],\n  addTodo: (text) =&gt;\n    set((state) =&gt; ({\n      todos: [\n        ...state.todos,\n        { id: Date.now().toString(), text, completed: false },\n      ],\n    })),\n  toggleTodo: (id) =&gt;\n    set((state) =&gt; ({\n      todos: state.todos.map((todo) =&gt;\n        todo.id === id ? { ...todo, completed: !todo.completed } : todo\n      ),\n    })),\n  removeTodo: (id) =&gt;\n    set((state) =&gt; ({\n      todos: state.todos.filter((todo) =&gt; todo.id !== id),\n    })),\n}));\n<\/code><\/pre>\n<h3>2. \u9875\u9762\u7ec4\u4ef6\uff1aTodoList \u4e0e AddTodo<\/h3>\n<p>\u5b89\u88c5\u5fc5\u8981\u7684 UI \u5e93\uff08\u53ef\u9009\uff0c\u672c\u6587\u7528\u539f\u751f\u7ec4\u4ef6\uff09\uff1a<\/p>\n<pre><code class=\"language-bash\">\nnpm install react-native-vector-icons\nnpx react-native link react-native-vector-icons\n<\/code><\/pre>\n<p>\u7f16\u5199\u4e3b\u9875\u9762\uff1a<\/p>\n<pre><code class=\"language-tsx\">\n\/\/ src\/screens\/HomeScreen.tsx\nimport React, { useState } from &#x27;react&#x27;;\nimport {\n  View,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  FlatList,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n} from &#x27;react-native&#x27;;\nimport Icon from &#x27;react-native-vector-icons\/Ionicons&#x27;;\nimport { useTodoStore } from &#x27;..\/store\/todoStore&#x27;;\n\nconst HomeScreen = () =&gt; {\n  const [input, setInput] = useState(&#x27;&#x27;);\n  const { todos, addTodo, toggleTodo, removeTodo } = useTodoStore();\n\n  const handleAdd = () =&gt; {\n    if (input.trim()) {\n      addTodo(input.trim());\n      setInput(&#x27;&#x27;);\n    }\n  };\n\n  return (\n    &lt;KeyboardAvoidingView\n      behavior={Platform.OS === &#x27;ios&#x27; ? &#x27;padding&#x27; : &#x27;height&#x27;}\n      style={styles.container}\n    &gt;\n      &lt;View style={styles.inputContainer}&gt;\n        &lt;TextInput\n          style={styles.input}\n          placeholder=&quot;\u6dfb\u52a0\u65b0\u4efb\u52a1...&quot;\n          value={input}\n          onChangeText={setInput}\n          onSubmitEditing={handleAdd}\n        \/&gt;\n        &lt;TouchableOpacity style={styles.addButton} onPress={handleAdd}&gt;\n          &lt;Icon name=&quot;add&quot; size={24} color=&quot;#fff&quot; \/&gt;\n        &lt;\/TouchableOpacity&gt;\n      &lt;\/View&gt;\n      &lt;FlatList\n        data={todos}\n        keyExtractor={(item) =&gt; item.id}\n        renderItem={({ item }) =&gt; (\n          &lt;View style={styles.todoItem}&gt;\n            &lt;TouchableOpacity onPress={() =&gt; toggleTodo(item.id)}&gt;\n              &lt;Icon\n                name={item.completed ? &#x27;checkbox&#x27; : &#x27;square-outline&#x27;}\n                size={24}\n                color={item.completed ? &#x27;#4caf50&#x27; : &#x27;#ccc&#x27;}\n              \/&gt;\n            &lt;\/TouchableOpacity&gt;\n            &lt;Text\n              style={[\n                styles.todoText,\n                item.completed &amp;&amp; styles.completedText,\n              ]}\n            &gt;\n              {item.text}\n            &lt;\/Text&gt;\n            &lt;TouchableOpacity onPress={() =&gt; removeTodo(item.id)}&gt;\n              &lt;Icon name=&quot;trash&quot; size={24} color=&quot;#f44336&quot; \/&gt;\n            &lt;\/TouchableOpacity&gt;\n          &lt;\/View&gt;\n        )}\n      \/&gt;\n    &lt;\/KeyboardAvoidingView&gt;\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: { flex: 1, padding: 16, backgroundColor: &#x27;#f5f5f5&#x27; },\n  inputContainer: { flexDirection: &#x27;row&#x27;, marginBottom: 16 },\n  input: {\n    flex: 1,\n    borderWidth: 1,\n    borderColor: &#x27;#ddd&#x27;,\n    borderRadius: 8,\n    paddingHorizontal: 12,\n    height: 48,\n    backgroundColor: &#x27;#fff&#x27;,\n  },\n  addButton: {\n    width: 48,\n    height: 48,\n    backgroundColor: &#x27;#2196f3&#x27;,\n    borderRadius: 8,\n    justifyContent: &#x27;center&#x27;,\n    alignItems: &#x27;center&#x27;,\n    marginLeft: 8,\n  },\n  todoItem: {\n    flexDirection: &#x27;row&#x27;,\n    alignItems: &#x27;center&#x27;,\n    backgroundColor: &#x27;#fff&#x27;,\n    padding: 16,\n    borderRadius: 8,\n    marginBottom: 8,\n  },\n  todoText: { flex: 1, marginHorizontal: 12, fontSize: 16 },\n  completedText: { textDecorationLine: &#x27;line-through&#x27;, color: &#x27;#aaa&#x27; },\n});\n\nexport default HomeScreen;\n<\/code><\/pre>\n<h3>3. \u5bfc\u822a\uff1aReact Navigation v6<\/h3>\n<p>\u5b89\u88c5\u4f9d\u8d56\uff1a<\/p>\n<pre><code class=\"language-bash\">\nnpm install @react-navigation\/native @react-navigation\/native-stack\nnpm install react-native-screens react-native-safe-area-context\n<\/code><\/pre>\n<p>\u914d\u7f6e\u5bfc\u822a\uff1a<\/p>\n<pre><code class=\"language-tsx\">\n\/\/ App.tsx\nimport React from &#x27;react&#x27;;\nimport { NavigationContainer } from &#x27;@react-navigation\/native&#x27;;\nimport { createNativeStackNavigator } from &#x27;@react-navigation\/native-stack&#x27;;\nimport HomeScreen from &#x27;.\/src\/screens\/HomeScreen&#x27;;\n\nconst Stack = createNativeStackNavigator();\n\nconst App = () =&gt; (\n  &lt;NavigationContainer&gt;\n    &lt;Stack.Navigator&gt;\n      &lt;Stack.Screen name=&quot;Home&quot; component={HomeScreen} options={{ title: &#x27;\u5f85\u529e\u4e8b\u9879&#x27; }} \/&gt;\n    &lt;\/Stack.Navigator&gt;\n  &lt;\/NavigationContainer&gt;\n);\n\nexport default App;\n<\/code><\/pre>\n<h2>\u6027\u80fd\u4f18\u5316\u6700\u4f73\u5b9e\u8df5<\/h2>\n<h3>1. \u4f7f\u7528 FlatList \u7684\u4f18\u5316\u5c5e\u6027<\/h3>\n<p>\u5bf9\u4e8e\u957f\u5217\u8868\uff0c\u52a1\u5fc5\u6dfb\u52a0 <code>keyExtractor<\/code>\u3001<code>getItemLayout<\/code> \u548c <code>removeClippedSubviews<\/code>\uff1a<\/p>\n<pre><code class=\"language-tsx\">\n&lt;FlatList\n  data={todos}\n  keyExtractor={(item) =&gt; item.id}\n  getItemLayout={(_, index) =&gt; ({ length: 72, offset: 72 * index, index })}\n  removeClippedSubviews={true}\n  initialNumToRender={10}\n  maxToRenderPerBatch={10}\n  windowSize={5}\n\/&gt;\n<\/code><\/pre>\n<h3>2. \u907f\u514d\u5185\u8054\u51fd\u6570\u4e0e\u5bf9\u8c61<\/h3>\n<p>\u5728 render \u4e2d\u521b\u5efa\u65b0\u51fd\u6570\u6216\u5bf9\u8c61\u4f1a\u5bfc\u81f4\u5b50\u7ec4\u4ef6\u4e0d\u5fc5\u8981\u7684\u91cd\u6e32\u67d3\u3002\u4f7f\u7528 <code>useCallback<\/code> \u548c <code>useMemo<\/code>\uff1a<\/p>\n<pre><code class=\"language-tsx\">\nconst renderItem = useCallback(({ item }) =&gt; (\n  &lt;TodoItem item={item} onToggle={toggleTodo} onRemove={removeTodo} \/&gt;\n), [toggleTodo, removeTodo]);\n<\/code><\/pre>\n<h3>3. \u56fe\u7247\u4f18\u5316<\/h3>\n<p>\u4f7f\u7528 <code>react-native-fast-image<\/code> \u66ff\u4ee3\u9ed8\u8ba4 Image \u7ec4\u4ef6\uff0c\u652f\u6301\u7f13\u5b58\u548c\u4f18\u5148\u7ea7\u3002<\/p>\n<h2>\u539f\u751f\u6a21\u5757\u8c03\u7528\uff1a\u83b7\u53d6\u8bbe\u5907\u4fe1\u606f<\/h2>\n<p>\u6709\u65f6\u9700\u8981\u8bbf\u95ee\u539f\u751f API\u3002\u4ee5\u83b7\u53d6\u7535\u6c60\u7535\u91cf\u4e3a\u4f8b\uff0c\u5b89\u88c5\u793e\u533a\u6a21\u5757\uff1a<\/p>\n<pre><code class=\"language-bash\">\nnpm install react-native-device-info\ncd ios &amp;&amp; pod install\n<\/code><\/pre>\n<p>\u4f7f\u7528\uff1a<\/p>\n<pre><code class=\"language-tsx\">\nimport DeviceInfo from &#x27;react-native-device-info&#x27;;\n\nconst batteryLevel = await DeviceInfo.getBatteryLevel();\nconsole.log(`\u5f53\u524d\u7535\u91cf\uff1a${(batteryLevel * 100).toFixed(0)}%`);\n<\/code><\/pre>\n<p>> \ud83d\udca1 \u63d0\u793a\uff1aRN 0.72 \u652f\u6301 TurboModules\uff0c\u4f46\u793e\u533a\u6a21\u5757\u53ef\u80fd\u5c1a\u672a\u9002\u914d\u3002\u82e5\u9047\u5230\u7f16\u8bd1\u9519\u8bef\uff0c\u53ef\u6682\u65f6\u964d\u7ea7\u4f7f\u7528\u65e7\u67b6\u6784\u3002<\/p>\n<h2>\u53cc\u7aef\u6253\u5305\u4e0e\u53d1\u5e03<\/h2>\n<h3>Android \u6253\u5305<\/h3>\n<ol>\n<li>\u751f\u6210\u7b7e\u540d\u5bc6\u94a5\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">\nkeytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000\n<\/code><\/pre>\n<ol>\n<li>\u914d\u7f6e <code>android\/gradle.properties<\/code>\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-properties\">\nMYAPP_UPLOAD_STORE_FILE=my-release-key.keystore\nMYAPP_UPLOAD_KEY_ALIAS=my-key-alias\nMYAPP_UPLOAD_STORE_PASSWORD=*****\nMYAPP_UPLOAD_KEY_PASSWORD=*****\n<\/code><\/pre>\n<ol>\n<li>\u5728 <code>android\/app\/build.gradle<\/code> \u4e2d\u914d\u7f6e\u7b7e\u540d\u5e76\u6267\u884c\uff1a<\/li>\n<\/ol>\n<pre><code class=\"language-bash\">\ncd android &amp;&amp; .\/gradlew assembleRelease\n<\/code><\/pre>\n<p>\u751f\u6210\u7684 APK \u4f4d\u4e8e <code>android\/app\/build\/outputs\/apk\/release\/<\/code>\u3002<\/p>\n<h3>iOS \u6253\u5305<\/h3>\n<ol>\n<li>\u5728 Xcode \u4e2d\u914d\u7f6e\u7b7e\u540d\u4e0e\u8bc1\u4e66\u3002<\/li>\n<li>\u9009\u62e9 Generic iOS Device\uff0c\u6267\u884c Product > Archive\u3002<\/li>\n<li>\u901a\u8fc7 Organizer \u4e0a\u4f20\u5230 App Store Connect\u3002<\/li>\n<\/ol>\n<p>> \u26a0\ufe0f \u6ce8\u610f\uff1aiOS \u6253\u5305\u5fc5\u987b\u4f7f\u7528 macOS\uff0c\u4e14\u9700\u8981\u4ed8\u8d39\u5f00\u53d1\u8005\u8d26\u53f7\uff08$99\/\u5e74\uff09\u3002<\/p>\n<h2>\u5e38\u89c1\u8e29\u5751\u4e0e\u89e3\u51b3\u65b9\u6848<\/h2>\n<ol>\n<li><strong>Metro \u7f13\u5b58\u95ee\u9898<\/strong>\uff1a\u4fee\u6539\u4ee3\u7801\u540e\u4e0d\u751f\u6548\uff0c\u5c1d\u8bd5 <code>npx react-native start --reset-cache<\/code>\u3002<\/li>\n<li><strong>Android 9+ \u7f51\u7edc\u8bf7\u6c42\u5931\u8d25<\/strong>\uff1a\u9700\u5728 <code>AndroidManifest.xml<\/code> \u4e2d\u6dfb\u52a0 <code>android:usesCleartextTraffic=\"true\"<\/code> \u6216\u4f7f\u7528 HTTPS\u3002<\/li>\n<li><strong>\u952e\u76d8\u906e\u6321\u8f93\u5165\u6846<\/strong>\uff1a\u4f7f\u7528 <code>KeyboardAvoidingView<\/code> \u5e76\u8bbe\u7f6e\u5408\u9002\u7684 <code>behavior<\/code>\u3002<\/li>\n<li><strong>iOS \u5b89\u5168\u533a\u57df<\/strong>\uff1a\u4f7f\u7528 <code>SafeAreaView<\/code> \u5305\u88f9\u9875\u9762\u5185\u5bb9\u3002<\/li>\n<li><strong>Hermes \u5f15\u64ce<\/strong>\uff1aRN 0.70+ \u9ed8\u8ba4\u542f\u7528 Hermes\uff0c\u53ef\u663e\u8457\u63d0\u5347\u542f\u52a8\u901f\u5ea6\uff0c\u4f46\u9700\u6ce8\u610f\u90e8\u5206\u5e93\u517c\u5bb9\u6027\u3002<\/li>\n<\/ol>\n<h2>\u603b\u7ed3\u4e0e\u4e0b\u4e00\u6b65<\/h2>\n<p>\u901a\u8fc7\u672c\u6587\uff0c\u4f60\u5df2\u5b8c\u6210\u4e00\u4e2a\u5177\u5907\u589e\u5220\u6539\u67e5\u3001\u72b6\u6001\u7ba1\u7406\u548c\u5bfc\u822a\u7684\u8de8\u5e73\u53f0\u5e94\u7528\uff0c\u5e76\u638c\u63e1\u4e86\u6027\u80fd\u4f18\u5316\u4e0e\u53d1\u5e03\u6d41\u7a0b\u3002React Native \u751f\u6001\u4ecd\u5728\u5feb\u901f\u6f14\u8fdb\uff0c\u5efa\u8bae\u8fdb\u4e00\u6b65\u63a2\u7d22\uff1a<\/p>\n<ul>\n<li><strong>\u65b0\u67b6\u6784\uff08Fabric &#038; TurboModules\uff09<\/strong>\uff1a\u4e86\u89e3\u5982\u4f55\u8fc1\u79fb\u4ee5\u83b7\u5f97\u66f4\u597d\u6027\u80fd\u3002<\/li>\n<li><strong>Expo \u751f\u6001<\/strong>\uff1a\u7b80\u5316\u5f00\u53d1\u4e0e\u90e8\u7f72\u6d41\u7a0b\u3002<\/li>\n<li><strong>React Native Web<\/strong>\uff1a\u590d\u7528\u4ee3\u7801\u5230 Web \u7aef\u3002<\/li>\n<li><strong>\u6d4b\u8bd5<\/strong>\uff1a\u4f7f\u7528 Jest \u548c Detox \u7f16\u5199\u5355\u5143\u4e0e\u7aef\u5230\u7aef\u6d4b\u8bd5\u3002<\/li>\n<\/ul>\n<p>\u8de8\u5e73\u53f0\u5f00\u53d1\u4e0d\u662f\u94f6\u5f39\uff0c\u4f46 React Native \u5728\u5f00\u53d1\u6548\u7387\u4e0e\u7528\u6237\u4f53\u9a8c\u4e4b\u95f4\u53d6\u5f97\u4e86\u826f\u597d\u5e73\u8861\u3002\u5e0c\u671b\u672c\u6587\u80fd\u5e2e\u52a9\u4f60\u5c11\u8d70\u5f2f\u8def\uff0c\u5feb\u901f\u4ea4\u4ed8\u9ad8\u8d28\u91cf\u5e94\u7528\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u901a\u8fc7\u4e00\u4e2a\u5b8c\u6574\u7684\u5f85\u529e\u4e8b\u9879\u5e94\u7528\uff0c\u624b\u628a\u624b\u5e26\u4f60\u638c\u63e1 React Native \u5f00\u53d1\u5168\u6d41\u7a0b\u3002\u6db5\u76d6\u73af\u5883\u914d\u7f6e\u3001\u6838\u5fc3\u7ec4\u4ef6\u3001\u72b6\u6001\u7ba1\u7406\u3001\u5bfc\u822a\u3001\u539f\u751f\u6a21\u5757\u8c03\u7528\u53ca\u53cc\u7aef\u6253\u5305\u53d1\u5e03\uff0c\u5e76\u5206\u4eab\u6027\u80fd\u4f18\u5316\u4e0e\u8e29\u5751\u7ecf\u9a8c\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,4],"tags":[236,239,13,238,237],"class_list":["post-259","post","type-post","status-publish","format-standard","hentry","category-3","category-4","tag-react-native","tag-react-navigation","tag-zustand","tag-238","tag-237"],"_links":{"self":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts\/259","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=259"}],"version-history":[{"count":0,"href":"https:\/\/yykcj.com\/index.php?rest_route=\/wp\/v2\/posts\/259\/revisions"}],"wp:attachment":[{"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=259"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=259"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yykcj.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=259"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}