React-Redux的新手。React Redux-Form使用包含多个提交子组件的子组件
我有一个子组件,它使用下面的“handleSubmit”和这部分代码工作。
<span
style={textLinkStyle}
onClick={handleSubmit(values =>
props.onSubmit({
...values,
sortBy: 'ClientNumber'
}
))}>
<span>Client # </span>
</span>
这里是上面的代码的子组件与所有相关的部分。
export const TableHeaders = (props) => {
const { handleSubmit } = props
const { sortBy, sortDirection } = props
return (
<div>
<div className="row">
<div className="col-md-2" style={headingCellStyle}>
<span
style={textLinkStyle}
onClick={handleSubmit(values =>
props.onSubmit({
...values,
sortBy: 'ClientNumber'
}
))}>
<span>Client # </span>
</span>
<GlyphiconDirectionChange sortDirection={sortDirection}/>
......
)
}
TableHeaders.propTypes = {
onSubmit: PropTypes.func.isRequired,
}
const TableHeadersForm = reduxForm({
form: 'TableHeaders',
})(TableHeaders)
export default TableHeadersForm
,所以我想这个组件的但却难免重复部分分离成独立的更小的组件,所以我可以重复使用。所以上面的组件现在是以下的父项。
但它也有多个提交一个用于排序方向向上和一个排序方向向下...我认为它会一直传播到顶端的父,但alac唉..不。
这就是我试过的。
const GlyphiconDirectionChange = (props) => {
const { handleSubmit } = props
const { sortDirection } = props
return (
<span>
{sortDirection === 'Descending' ?
<span
style={textLinkStyle}
onClick={handleSubmit(values =>
props.onSubmit({
...values,
sortDirection: 'Ascending'
}
))}
className='glyphicon glyphicon-sort-by-attributes'>
</span>
:
<span
style={textLinkStyle}
onClick={handleSubmit(values =>
props.onSubmit({
...values,
sortDirection: 'Descending'
}
))}
className='glyphicon glyphicon-sort-by-attributes-alt'>
</span>
}
</span>
)}
我发现那是什么时候的的tableHeader组件作为一个更大的父组件的一部分handleSubmit作品 - 它的下一层。第一个订单的孩子。
它在GlyphiconDirectionChange组件中不起作用。第二个孩子......为什么?
我得到以下错误控制台
Exception: Call to Node module failed with error: TypeError: handleSubmit is not a function
这是一个语法错误。我应该如何处理“handleSubmit”,同时发送更新值时,它的子部分也是子组件。
所以回顾一下。 HandleSubmit工作的孩子,但不工作的子组件的孩子..第二级下调...
编辑
我注意到,#Dennis曾建议我用一个发货,而不是使用handleSubmit的。这是完整的ClientsContainer:
import React, { Component, PropTypes } from 'react'
import { connect } from 'react-redux'
import Clients from './Clients'
import SearchClients from './SearchClients'
import TableHeaders from './TableHeaders'
import { requestClients } from './reducer'
class ClientsContainer extends Component {
static contextTypes = {
router: PropTypes.object.isRequired
}
componentDidMount() {
if (!this.props.isAuthorised) {
this.context.router.push('/')
return
}
this.fetchClients()
}
fetchClients = (values = {}) => {
const { currentPage, query, sortBy, sortDirection } = this.props
const searchParams = {
currentPage,
query,
sortBy,
sortDirection,
...values,
}
console.log('fetchClients()!', values, searchParams)
this.props.requestClients(searchParams)
}
clientsSearch = (values = {}) => {
const { query, sortBy, sortDirection } = this.props
values.query = values.query || ''
const searchParams = {
query,
sortBy,
sortDirection,
...values,
currentPage: 1,
}
console.log('clientsSearch()!', values, searchParams)
this.fetchClients(searchParams)
}
changeHeaders = (values = {}) => {
const { query, sortBy, sortDirection } = this.props
values.query = values.query || ''
const searchParams = {
query,
sortBy,
sortDirection,
...values,
currentPage: 1,
}
console.log('changeHeaders()!', values, searchParams)
this.fetchClients(searchParams)
}
handlePageChanged = (pageIndex) => {
this.fetchClients({
currentPage: pageIndex,
})
}
render() {
const { clients, currentPage, query, sortBy, sortDirection, totalClients, totalPages } = this.props
return (
<div className="row">
<div className="col-md-12">
<SearchClients onSubmit={this.clientsSearch}
currentPage={currentPage}
query={query}
sortBy={sortBy}
sortDirection={sortDirection}
/>
<TableHeaders onSubmit={this.changeHeaders}
currentPage={currentPage}
query={query}
sortBy={sortBy}
sortDirection={sortDirection}
/>
<Clients clients={clients}
currentPage={currentPage}
query={query}
sortBy={sortBy}
sortDirection={sortDirection}
totalClients={totalClients}
totalPages={totalPages}
onPageChanged={this.handlePageChanged}
/>
</div>
</div>
)
}
}
const mapStateToProps = (state) => ({
isAuthorised: state.login.isAuthorised,
clients: state.clients.clients,
currentPage: state.clients.currentPage,
query: state.clients.query,
sortBy: state.clients.sortBy,
sortDirection: state.clients.sortDirection,
totalClients: state.clients.totalClients,
totalPages: state.clients.totalPages,
})
const mapDispatchToProps = (dispatch) => ({
requestClients: (values) => dispatch(requestClients(values)),
})
export default connect(mapStateToProps, mapDispatchToProps)(ClientsContainer)
它确实有发送,它是减速机的地方。再次..如果我想组成一个表单到许多组件中,其中一个可能是一个链接的标题..什么是最好的方式来做到这一点,当它可能是父组件的一个组件的组件是唯一一个派遣...
我已经使用特定于您的用例的示例更新了原始答案。 – Dennis