javascript - react 路由器 child 不传播

标签 javascript reactjs react-router

我正在尝试使用 react-router,但我无法传播子组件。

index.js

import 'babel-polyfill';
import React from 'react';
import { render } from 'react-dom';
import { Router, Route, browserHistory } from 'react-router';

import App from './App';

import Login from './containers/Login';

const rootElement = document.getElementById('app');

render((
	<Router history={browserHistory}>
		<Route path="/" component={App}>
			<Route path="login" component={Login}/>
		</Route>
	</Router>
), rootElement);

App.js

import React, { Component, PropTypes } from 'react';
import { Login } from './containers';

export default class App extends Component {

	constructor(props) {
		super(props);
	}

	render() {
		const { children } = this.props;
		return (
			<div className="content">
				{children}
			</div>
		);
	}
}

App.propTypes = {
	children: PropTypes.any,
};

LoginPage.js

import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';

import { Login } from '../components';

export default class LoginPage extends Component {

	constructor(props, context) {
		super(props, context);
	}

	handleSubmit(event) {
		event.preventDefault();
	}

	render() {
		const { handleSubmit, redirect } = this.props;
		return (
			<Login handleSubmit={handleSubmit}
			       redirect={redirect}
			/>
		);
	}
}

LoginComponent.js

import React, { Component, PropTypes } from 'react';

export default class Login extends Component {

	constructor(props, context) {
		super(props, context);

		this.state = {
			email: '',
			password: '',
		};
	}

	handleChange(field, event) {
		const nextState = this.state;

		nextState[field] = event.target.value;

		this.setState(nextState);
	}

	handleSubmit(event) {
		event.preventDefault();

		this.props.handleSubmit(this.state);
	}

	render() {
		return (
			<form onSubmit={event => this.handleSubmit(event)}>
				<input
					type="text" placeholder="Email"
					value={this.state.email}
					onChange={this.handleChange.bind(this, 'email')}
				/>
				<input
					type="password" placeholder="Password"
					value={this.state.password}
					onChange={this.handleChange.bind(this, 'password')}
				/>
				<input type="submit" value="Submit"/>
			</form>
		);
	}
}

Login.propTypes = {
	handleSubmit: PropTypes.func.isRequired,
};

如果我只导入 LoginPage直接进入App.js我尝试渲染 {children} 的地方它工作得很好。在检查中它只是说 child 是未定义的

react @0.14.6

react-dom@0.14.6

react-router@2.0.0-rc5

作为旁注,我运行了 npm list react-router 并且得到了它

`-- (empty)

npm ERR! code 1

任何帮助都会很棒!!

编辑:我将第一个代码片段编辑为 import Login from './containers/Login';来自 import { Login } from './containers/Login';

那是一种简化问题的类型。我最初是用另一种方式使用的,因为我实际上正在为容器使用 index.js 并且正在调用 import { Login } from './containers';

我已经单步执行了代码,它显示 Loginindex.js 中未定义但是children当我到达App.js

下面是index.js中断点的截图和 App.js在同一次运行中。 index.js显示登录正在初始化,但随后 children未定义。

index.js

[ App.js[2]

好吧,我现在已经尽可能地将整个事情简化为一个文件,但它仍然不起作用

import 'babel-polyfill';
import React, { Component } from 'react';
import { render } from 'react-dom';
import { Router, Route, browserHistory } from 'react-router';

class App extends Component {

	constructor(props) {
		super(props);
	}

	render() {
		const { children } = this.props;
		return (
			<div className="content">
				{children}
			</div>
		);
	}
}

class Child extends Component {
	render() {
		return (
			<p>I am a child</p>
		);
	}
}

const rootElement = document.getElementById('app');

render((
	<Router history={browserHistory}>
		<Route path="/" component={App}>
			<Route path="login" component={Child}/>
		</Route>
	</Router>
), rootElement);

然后我运行它并得到以下内容

enter image description here

然后我添加了<Child />直接进入 App 的渲染属性得到了这个

enter image description here

所以这不是我导入文件等方式的问题。

最佳答案

解决方案非常简单。替换

import { Login } from './containers/Login';

import  Login  from './containers/Login';

在你的 index.js 中

您的子属性总是“未定义”的原因是因为传递的组件是“未定义”的:

enter image description here

如果您对导入语法有疑问,我可以推荐这个 SO 问题“using brackets with javascript import syntax

查看完整代码: 索引.js

import React from 'react';
import { render } from 'react-dom';
import { Router, Route, browserHistory } from 'react-router';

import App from './App';
import Login from './containers/LoginPage';

const rootElement = document.getElementById('app');

render((
    <Router history={browserHistory}>
        <Route path="/" component={App}>
            <Route path="login" component={Login}/>
        </Route>
    </Router>
), rootElement);

App.js

import React, { Component, PropTypes } from 'react';

export default class App extends Component {

    constructor(props) {
        super(props);
    }

    render() {
        const { children } = this.props;
        return (
            <div className="content">
                {children}
            </div>
        );
    }
}

App.propTypes = {
    children: PropTypes.any,
};

./containers/LoginPage.js

import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';

import Login from '../components/Login';

export default class LoginPage extends Component {

    constructor(props, context) {
        super(props, context);
    }

    handleSubmit(event) {
        event.preventDefault();
    }

    render() {
        const { handleSubmit, redirect } = this.props;
        return (
            <Login handleSubmit={handleSubmit}
                   redirect={redirect}
            />
        );
    }
}

./components/Login.js

import React, { Component, PropTypes } from 'react';

export default class Login extends Component {

    constructor(props, context) {
        super(props, context);

        this.state = {
            email: '',
            password: '',
        };
    }

    handleChange(field, event) {
        const nextState = this.state;

        nextState[field] = event.target.value;

        this.setState(nextState);
    }

    handleSubmit(event) {
        event.preventDefault();

        this.props.handleSubmit(this.state);
    }

    render() {
        return (
            <form onSubmit={event => this.handleSubmit(event)}>
                <input
                    type="text" placeholder="Email"
                    value={this.state.email}
                    onChange={this.handleChange.bind(this, 'email')}
                />
                <input
                    type="password" placeholder="Password"
                    value={this.state.password}
                    onChange={this.handleChange.bind(this, 'password')}
                />
                <input type="submit" value="Submit"/>
            </form>
        );
    }
}

Login.propTypes = {
    handleSubmit: PropTypes.func.isRequired,
};

用 react 0.14.6 和 react-router 2.0.0-rc5 证明 enter image description here

关于javascript - react 路由器 child 不传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34915518/

相关文章:

javascript - .createElement() 与 HTML

reactjs - React.js URL 更改但 View 未更改

javascript - 获取每个 TD,然后将其格式化为货币

javascript - 当我分配给 element.style 时,为什么我的元素的样式没有改变?

javascript - 切换可见性(当另一个 div 元素呈现可见时自动导致隐藏)

javascript - 尝试更新 React Router 4.0.0 但遇到问题

javascript - react 路由器困惑

javascript - mongodb 查找与 $elemMatch 相反的

javascript - 自定义加载器不适用于 react-table

javascript - TypeError : action. Payload.map.size 不是一个函数