React Native Navigation 是一个用于React Native应用程序的跨平台导航库。以下是一个简单的例子,展示如何使用React Native Navigation创建一个基本的堆栈导航器:




import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import React from 'react';
import { Text, Button } from 'react-native';
 
// 创建一个Stack Navigator
const Stack = createStackNavigator();
 
// 定义屏幕组件
function HomeScreen({ navigation }) {
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>Home Screen</Text>
      <Button
        title="Go to Details"
        onPress={() => navigation.navigate('Details')}
      />
    </View>
  );
}
 
function DetailsScreen({ navigation }) {
  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Text>Details Screen</Text>
      <Button
        title="Go back to Home"
        onPress={() => navigation.goBack()}
      />
    </View>
  );
}
 
// 应用程序的入口点
export default function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}

这段代码展示了如何使用React Native Navigation库创建一个简单的堆栈导航器,并包含了两个屏幕:HomeScreen和DetailsScreen。用户可以通过按钮从主屏幕导航到详情屏幕,然后通过按钮返回主屏幕。这个例子提供了一个清晰的起点,用于学习和构建跨平台的移动应用程序。




import React from 'react';
import { useTranslation, Trans } from 'react-i18next';
 
function LanguageToggle() {
  const { t, i18n } = useTranslation();
 
  const changeLanguage = (lang) => {
    i18n.changeLanguage(lang);
  };
 
  return (
    <div>
      <button onClick={() => changeLanguage('en')}>English</button>
      <button onClick={() => changeLanguage('es')}>Español</button>
    </div>
  );
}
 
export default LanguageToggle;

这段代码使用了React的函数组件和Hooks API (useTranslation) 来实现一个简单的语言切换功能。用户可以通过点击按钮来切换应用程序的语言。i18n.changeLanguage 方法用于改变当前的语言配置。这个例子展示了如何在React应用中实现语言的动态切换。




import SQLite from 'react-native-sqlite3';
 
// 打开或创建数据库
const db = new SQLite.Database('MyDatabase.db');
 
// 创建表
db.exec('CREATE TABLE IF NOT EXISTS People (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)', (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('Table created successfully');
  }
});
 
// 插入数据
db.run('INSERT INTO People (name, age) VALUES (?, ?), (?, ?)', 'Alice', 30, 'Bob', 25, (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('Rows inserted successfully');
  }
});
 
// 查询数据
db.all('SELECT name, age FROM People', (err, rows) => {
  if (err) {
    console.error(err);
  } else {
    console.log('People table:');
    rows.forEach((row) => console.log(row.name + ' - ' + row.age));
  }
});
 
// 关闭数据库
db.close();

这段代码展示了如何在React Native应用中使用react-native-sqlite3库来打开或创建一个SQLite数据库,创建一个表,插入数据,以及执行一个查询操作。这是一个简单的例子,展示了SQLite在React Native项目中的基本用法。




import React from 'react';
import ReactDOM from 'react-dom';
 
// 创建一个简单的函数组件
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
 
// 创建一个类组件
class WelcomeClass extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}
 
// 渲染组件到DOM
ReactDOM.render(
  <Welcome name="React User" />,
  document.getElementById('root')
);
 
// 渲染类组件
ReactDOM.render(
  <WelcomeClass name="React User" />,
  document.getElementById('root')
);

这段代码展示了如何在React中创建一个简单的组件,并使用ReactDOM.render()方法将它渲染到页面上的某个DOM元素中。这是学习React的基本步骤之一。

React Native Menu 是一个为React Native应用提供跨平台菜单实现的库。以下是如何使用React Native Menu库创建一个简单的下拉菜单的例子:

首先,确保你已经安装了react-native-menu库。如果未安装,可以使用npm或yarn来安装:




npm install react-native-menu --save
# or
yarn add react-native-menu

然后,你可以在你的React Native代码中这样使用Menu组件:




import React from 'react';
import { View, Text, TouchableOpacity } from 'react-native';
import Menu, { MenuItem, MenuDivider } from 'react-native-menu';
 
export default class MyMenu extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      menuVisible: false,
    };
  }
 
  render() {
    return (
      <View>
        <TouchableOpacity onPress={() => this.setState({ menuVisible: true })}>
          <Text>点击这里打开菜单</Text>
        </TouchableOpacity>
        <Menu
          visible={this.state.menuVisible}
          onDismiss={() => this.setState({ menuVisible: false })}
          anchor={<Text>菜单锚点</Text>}
        >
          <MenuItem onPress={() => alert('选项1被点击')}>选项1</MenuItem>
          <MenuItem onPress={() => alert('选项2被点击')}>选项2</MenuItem>
          <MenuDivider />
          <MenuItem onPress={() => alert('选项3被点击')}>选项3</MenuItem>
        </Menu>
      </View>
    );
  }
}

在这个例子中,我们创建了一个简单的下拉菜单,通过一个TouchableOpacity组件来触发显示菜单。当用户点击TouchableOpacity时,我们将menuVisible状态设置为true,从而打开菜单。每个MenuItem都有一个onPress回调函数,当用户选择一个选项时会被调用。MenuDivider组件用于在菜单项之间添加可视的分隔线。

React 懒加载通常指的是代码分割,将组件代码分割为不同的块,在需要时才加载相应的代码。在React中,可以使用React.lazy函数和React Router的<Suspense>组件来实现。

以下是一个使用React.lazy和Suspense实现组件懒加载的例子:




import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
 
// 使用lazy函数来创建一个动态加载的组件
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
 
function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Switch>
          <Route path="/about" component={About} />
          <Route path="/" component={Home} />
        </Switch>
      </Suspense>
    </Router>
  );
}
 
export default App;

在这个例子中,我们创建了两个懒加载组件HomeAbout。当用户访问/about路径时,About组件会被懒加载。Suspense组件的fallback属性接受一个React元素,它会在组件正在加载时显示。当懒加载的组件加载完成后,就会显示对应的组件内容。

在React中,组件间的数据通信可以通过多种方法实现,以下是几种常用的方法:

  1. 父组件向子组件通信:通过props传递数据。



// 父组件
function ParentComponent() {
  const data = 'some data';
  return <ChildComponent data={data} />;
}
 
// 子组件
function ChildComponent({ data }) {
  return <div>{data}</div>;
}
  1. 子组件向父组件通信:通过回调函数。



// 父组件
function ParentComponent({ children }) {
  const [data, setData] = useState('');
 
  const handleDataChange = useCallback((newData) => {
    setData(newData);
  }, []);
 
  return (
    <div>
      <ChildComponent onDataChange={handleDataChange} />
      <p>{data}</p>
    </div>
  );
}
 
// 子组件
function ChildComponent({ onDataChange }) {
  const [inputData, setInputData] = useState('');
 
  const handleChange = (event) => {
    setInputData(event.target.value);
  };
 
  const handleSubmit = () => {
    onDataChange(inputData);
  };
 
  return (
    <div>
      <input value={inputData} onChange={handleChange} />
      <button onClick={handleSubmit}>Submit</button>
    </div>
  );
}
  1. 兄弟组件通信:使用context API或者自定义事件系统(如pub-sub模式)。



// Context API
const DataContext = createContext();
 
// Provider组件
function DataProvider({ children }) {
  const [data, setData] = useState('');
 
  return (
    <DataContext.Provider value={{ data, setData }}>
      {children}
    </DataContext.Provider>
  );
}
 
// Consumer组件
function ConsumerComponent() {
  const { data, setData } = useContext(DataContext);
  // ...
}
  1. 跨多层组件通信:使用自顶向下的context API,或者状态管理库(如Redux或MobX)。



// Redux示例
const initialState = { data: '' };
const reducer = (state, action) => {
  switch (action.type) {
    case 'UPDATE_DATA':
      return { ...state, data: action.payload };
    default:
      return state;
  }
};
 
const DataProvider = ({ children }) => {
  const [state, dispatch] = useReducer(reducer, initialState);
 
  return (
    <ReduxContext.Provider value={{ state, dispatch }}>
      {children}
    </ReduxContext.Provider>
  );
};
 
// 使用Redux的connect高阶组件连接组件
const ConnectedComponent = connect(state => ({ data: state.data }))(Component);

以上是React组件间数据通信的常用方法,具体使用哪种取决于应用场




import React from 'react';
import { Text, View } from 'react-native';
import CheckBox from '@react-native-community/checkbox';
 
export default class MyCheckboxes extends React.Component {
  state = {
    checked1: false,
    checked2: true,
  };
 
  render() {
    const { checked1, checked2 } = this.state;
    return (
      <View>
        <CheckBox
          value={checked1}
          onValueChange={newValue => this.setState({ checked1: newValue })}
        />
        <Text>Option 1 is {checked1 ? 'checked' : 'unchecked'}</Text>
        
        <CheckBox
          value={checked2}
          onValueChange={newValue => this.setState({ checked2: newValue })}
          color="green" // 自定义颜色
        />
        <Text>Option 2 is {checked2 ? 'checked' : 'unchecked'}</Text>
      </View>
    );
  }
}

这段代码演示了如何在React Native应用中使用@react-native-community/checkbox组件。它创建了两个复选框,每个复选框都可以被用户点击来改变其状态,并且在页面上显示其当前状态。此外,还演示了如何通过color属性来自定义复选框的颜色。

React 错误边界(Error Boundary)是 React 16 引入的一个新特性,它可以捕获并打印 JavaScript 错误,以帮助开发者更好地进行调试。如果一个组件中的子组件抛出了一个未被捕获的错误,React 会通过组件的\_render\_方法,将错误传播到父组件,直至找到一个错误边界为止。如果没有错误边界,错误会导致整个应用崩溃。

解决方法:

  1. 定义一个错误边界组件,它应该定义static getDerivedStateFromError()componentDidCatch()这两个生命周期方法。
  2. 将需要包裹的子组件作为错误边界的子组件。
  3. getDerivedStateFromError()中返回一个状态,这样可以在渲染阶段更新组件,展示一个后备的UI,比如错误提示。
  4. componentDidCatch()中可以记录错误信息,发送错误报告等。

示例代码:




class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }
 
  static getDerivedStateFromError(error) {
    // 更新状态表示发生错误
    return { hasError: true };
  }
 
  componentDidCatch(error, errorInfo) {
    // 你可以在这里记录错误信息
    console.error('ErrorBoundary caught an error', error, errorInfo);
  }
 
  render() {
    if (this.state.hasError) {
      // 可以渲染一个后备的UI
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children; 
  }
}
 
// 使用错误边界
const App = () => (
  <ErrorBoundary>
    <MyComponent />
  </ErrorBoundary>
);

在上面的例子中,ErrorBoundary组件会捕获并处理MyComponent抛出的任何未被处理的错误。如果MyComponent抛出了错误,ErrorBoundary会渲染一个简单的错误信息,而不是让整个应用崩溃。




import React, { PureComponent } from 'react';
import { WebView } from 'react-native-webview';
 
export default class MyWebView extends PureComponent {
  handleNavigationStateChange = (navState) => {
    // 如果网页中的链接是通过JavaScript的history.pushState()方法添加的,
    // 则navState.url可能会变化而不会导致标准的HTTP重定向或按钮点击。
    // 在这种情况下,需要在state中手动跟踪URL的历史记录。
    if (this.props.shouldOverrideBackButton(navState.url)) {
      this.props.onBackPress();
    }
  };
 
  render() {
    return (
      <WebView
        source={{ uri: this.props.url }}
        onNavigationStateChange={this.handleNavigationStateChange}
      />
    );
  }
}

这段代码示例展示了如何在React Native应用中使用WebView组件,并处理Android设备上的物理返回按钮。当用户尝试返回时,如果当前WebView的URL符合特定条件,则会调用onBackPress处理函数。这个处理函数可以用于执行自定义的返回逻辑,例如返回到上一个视图或者关闭当前视图。