使用路由器v4的React Native匹配标记,使组件未定义

时间:2017-02-25 05:32:20

标签: react-native react-router-v4

我正在尝试使用基于此link

的反应路由器v4的路由器本机

Match标记给我一个错误

React.createElement: type is invalid — expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it’s defined in. Check the render method of

组件可用,我甚至尝试过显式创建组件。

完整代码     从'react'导入React,{Component};       import {         AppRegistry,         样式表         文本,         视图,         TouchableHighlight,       来自'react-native';       从'react-router'导入{Match,Miss,MemoryRouter as Router};

  const componentFactory = (routeName) => () => (
    <View>
      <Text style={styles.route}>{routeName}</Text>
    </View>
  )

  const NavLink = ({to, children}, context) => {
    const pressHandler = () => context.router.transitionTo(to);
    return (
      <TouchableHighlight onPress={pressHandler}>
        {children}
      </TouchableHighlight>
    )
  }
  NavLink.contextTypes = {router: React.PropTypes.object}

  export default class RR4Native extends Component {
    render() {
      return (
        <Router>
          <View style={styles.container}>
            <View style={styles.routeContainer}>
              <Match exactly pattern="/" component={componentFactory('Home')}/>
              <Match pattern="/about" component={componentFactory('About')}/>
              <Match pattern="/topics" component={componentFactory('Topics')}/>
              <Miss component={componentFactory('Nope, nothing here')}/>
            </View>
            <View style={styles.container}>
              <NavLink to="/">
                <Text style={styles.routeLink}>
                  Home
                </Text>
              </NavLink>
              <NavLink to="/about">
                <Text style={styles.routeLink}>
                  About
                </Text>
              </NavLink>
              <NavLink to="/topics">
                <Text style={styles.routeLink}>
                  Topics
                </Text>
              </NavLink>
              <NavLink to="/broken">
                <Text style={styles.routeLink}>
                  Broken
                </Text>
              </NavLink>
            </View>
          </View>
        </Router>
      );
    }
  }

  const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
      backgroundColor: '#F5FCFF',
    },
    route: {
      color: '#701010',
      fontSize: 40
    },
    routeLink: {
      color: '#0000FF'
    },
    routeContainer: {
      flex: 1,
      justifyContent: 'center'
    }

  });

  AppRegistry.registerComponent('RR4Native', () => RR4Native);

1 个答案:

答案 0 :(得分:1)

react-router的最终版本中,没有Match也没有Miss。您只需使用Route即可。在您的情况下,您需要执行以下操作:

<View style={styles.routeContainer}>
    <Switch>
        <Route exact path="/" component={componentFactory('Home')}/>
        <Route path="/about" component={componentFactory('About')}/>
        <Route path="/topics" component={componentFactory('Topics')}/>
        <Route component={componentFactory('Nope, nothing here')}/>
    </Switch>
</View>

有关详细信息,请参阅NoMatchExample in React Router docs