在 component/container 中组织 React 应用程序
Organizing React app in component/container
我正在使用 React Redux Starter Kit 并尝试在 component/container 中组织我的代码,并且在寻找正确的过程时遇到了一些困难。我意识到这有点松散,但我希望就如何更好地组织事物提供一些意见。
目前我有 3 个文件 - CheckoutForm(一种 redux 表单)、CheckoutView(一个具有表单的简单页面)和 CheckoutContainer,后者现在几乎什么都不做。根据阅读有关 component/container 分离的建议,CheckoutView 似乎应该相同,但我或许应该将提交功能从其中拉出并将其放入 CheckoutContainer 中?我如何最好地重新连接此代码:
CheckoutContainer.js
import Checkout from '../components/CheckoutView'
export default Checkout
CheckoutView.js
import React from 'react'
import classes from './CheckoutView.scss'
import CheckoutForm from '../forms/CheckoutForm'
const submit = require('../modules/submit').default
export const CheckoutView = () => (
<div>
<h4 className={classes.header}>Checkout</h4>
<CheckoutForm onSubmit={submit}/>
</div>
)
export default CheckoutView
CheckoutForm.js
import { Field, reduxForm } from 'redux-form'
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} placeholder={label} type={type}/>
{touched && error && <span>{error}</span>}
</div>
</div>
)
const CheckoutForm = (props) => {
const { error, handleSubmit, pristine, reset, submitting } = props
return (
<form onSubmit={handleSubmit}>
<Field name="username" type="text" component={renderField} label="Username"/>
<Field name="password" type="password" component={renderField} label="Password"/>
{error && <strong>{error}</strong>}
<div>
<button type="submit" disabled={submitting}>Log In</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>Clear Values</button>
</div>
</form>
)
}
export default reduxForm({
form: 'checkoutForm'
})(CheckoutForm)
容器的主要目的是从 store 中提取组件需要知道的信息并将其传递给它,同时提供回调作为 props 来处理容器中的动作调度,所以组件只需要传递它知道的参数,仅此而已。这样你的组件就知道并做它所需要的,没有别的,它甚至根本不知道 Redux。
看看你的代码,你做对了
I should perhaps pull the submit function out of it and put that in the CheckoutContainer
这正是您应该做的,因为这是组件唯一不应该关心的事情。
在您的容器中
import { connect } from 'react-redux';
import Checkout from '../components/CheckoutView';
const submit = require('../modules/submit').default
const mapStateToProps = state => {
return { };
};
const mapDispatchToProps = dispatch => {
return { onSubmit: submit };
};
export default connect(mapStateToProps, mapDispatchToProps)(Checkout);
在视图中:
import React from 'react'
import classes from './CheckoutView.scss'
import CheckoutForm from '../forms/CheckoutForm'
export const CheckoutView = ({ onSubmit }) => (
<div>
<h4 className={classes.header}>Checkout</h4>
<CheckoutForm onSubmit={onSubmit}/>
</div>
)
export default CheckoutView
随着应用程序的扩展,您将准备好将任何信息从状态传递到 mapStateToProps
中的组件以及 mapDispatchToProps
中的其他回调。
我正在使用 React Redux Starter Kit 并尝试在 component/container 中组织我的代码,并且在寻找正确的过程时遇到了一些困难。我意识到这有点松散,但我希望就如何更好地组织事物提供一些意见。
目前我有 3 个文件 - CheckoutForm(一种 redux 表单)、CheckoutView(一个具有表单的简单页面)和 CheckoutContainer,后者现在几乎什么都不做。根据阅读有关 component/container 分离的建议,CheckoutView 似乎应该相同,但我或许应该将提交功能从其中拉出并将其放入 CheckoutContainer 中?我如何最好地重新连接此代码:
CheckoutContainer.js
import Checkout from '../components/CheckoutView'
export default Checkout
CheckoutView.js
import React from 'react'
import classes from './CheckoutView.scss'
import CheckoutForm from '../forms/CheckoutForm'
const submit = require('../modules/submit').default
export const CheckoutView = () => (
<div>
<h4 className={classes.header}>Checkout</h4>
<CheckoutForm onSubmit={submit}/>
</div>
)
export default CheckoutView
CheckoutForm.js
import { Field, reduxForm } from 'redux-form'
const renderField = ({ input, label, type, meta: { touched, error } }) => (
<div>
<label>{label}</label>
<div>
<input {...input} placeholder={label} type={type}/>
{touched && error && <span>{error}</span>}
</div>
</div>
)
const CheckoutForm = (props) => {
const { error, handleSubmit, pristine, reset, submitting } = props
return (
<form onSubmit={handleSubmit}>
<Field name="username" type="text" component={renderField} label="Username"/>
<Field name="password" type="password" component={renderField} label="Password"/>
{error && <strong>{error}</strong>}
<div>
<button type="submit" disabled={submitting}>Log In</button>
<button type="button" disabled={pristine || submitting} onClick={reset}>Clear Values</button>
</div>
</form>
)
}
export default reduxForm({
form: 'checkoutForm'
})(CheckoutForm)
容器的主要目的是从 store 中提取组件需要知道的信息并将其传递给它,同时提供回调作为 props 来处理容器中的动作调度,所以组件只需要传递它知道的参数,仅此而已。这样你的组件就知道并做它所需要的,没有别的,它甚至根本不知道 Redux。
看看你的代码,你做对了
I should perhaps pull the submit function out of it and put that in the CheckoutContainer
这正是您应该做的,因为这是组件唯一不应该关心的事情。
在您的容器中
import { connect } from 'react-redux';
import Checkout from '../components/CheckoutView';
const submit = require('../modules/submit').default
const mapStateToProps = state => {
return { };
};
const mapDispatchToProps = dispatch => {
return { onSubmit: submit };
};
export default connect(mapStateToProps, mapDispatchToProps)(Checkout);
在视图中:
import React from 'react'
import classes from './CheckoutView.scss'
import CheckoutForm from '../forms/CheckoutForm'
export const CheckoutView = ({ onSubmit }) => (
<div>
<h4 className={classes.header}>Checkout</h4>
<CheckoutForm onSubmit={onSubmit}/>
</div>
)
export default CheckoutView
随着应用程序的扩展,您将准备好将任何信息从状态传递到 mapStateToProps
中的组件以及 mapDispatchToProps
中的其他回调。