我有兩個組件:一個容器組件和一個表示組件。在功能(無狀態)組件中讀取<input>
容器使用演示組件獲取顯示Post所需的所有信息和操作。在展示的組件上,我有一種方法可以在呈現信息和編輯信息之間切換。當我編輯並提交有關帖子的數據時,我想從所有不同的輸入中讀取值,以便發送一個動作。
但是,在<form id='theForm' onSubmit={onHandleSubmit}>
標記內的輸入是而不是。相反,在<form>
之外的所有<input>
和<button type='submit'>
都具有form='theForm'
屬性。
我以爲我可以有形式以外的許多<input>
,但只要form
屬性對相應<form>
指出,我能讀懂它重視使用事件handleOnSubmit (e) {...}
臨危。不過,我還沒有想出如何做到這一點。
如何讀取我的handleOnSubmit
函數上的輸入值?或者這是一個完全錯誤的想法,我應該放棄?
// PostSummaryContainer.js
import React, { PropTypes, Component } from 'react'
import { connect } from 'react-redux'
import { loadPost, editPost, editPostCancel, editPostSubmit } from '../../actions/posts'
import PostSummaryView from '../../views/details/summary'
class PostSummaryContainer extends Component {
constructor (props) {
super(props)
this.handleOnSubmit = this.handleOnSubmit.bind(this)
this.handleOnCancel = this.handleOnCancel.bind(this)
this.handleOnSubmit = this.handleOnSubmit.bind(this)
}
handleOnEdit (e) {
e.preventDefault()
this.props.editPost()
}
handleOnCancel (e) {
e.preventDefault()
this.props.editPostCancel()
}
handleOnSubmit (e) {
e.preventDefault()
// How do I read the input values? <--------------------
}
componentWillMount() {
const {
id,
loadPost
} = this.props
loadPost(id)
}
render() {
const {
post,
isLoading,
isEditing
} = this.props
const viewProps = {
bacon,
isLoading,
isEditing,
handleOnEdit: this.handleOnEdit,
handleOnCancel: this.handleOnCancel,
handleOnSubmit: this.handleOnSubmit
}
return (
<PostSummaryView {...viewProps} />
)
}
}
const mapStateToProps = (state, ownProps) => {
const {
params: {
id
}
} = ownProps
const post = state.entities.post[id]
const {
isLoading,
isEditing
} = state.posts
return {
id,
post,
isLoading,
isEditing
}
}
export default connect(
mapStateToProps,
{ loadPost, editPost, editPostCancel, editPostSubmit }
)(PostSummaryContainer)
在我的演示組件:
// PostSummmaryView.js
import React from 'react'
import moment from 'moment'
function PostSummaryView (props) {
const {
post,
isLoading,
isEditing,
handleOnEdit,
handleOnCancel,
handleOnSubmit
} = props
const formId = 'editPostForm'
return (
isLoading
? <div>Loading...</div>
: <div className='row'>
{isEditing && <form id={formId} onSubmit={handleOnSubmit}><input type='text' name='name' /></form>}
<div className='col-md-6'>
<img src={post.media.url} className='img-responsive' />
{isEditing && <input type='file' name='media' form={formId}/>}
</div>
<div className='col-md-6'>
<h1>{post.name}</h1>
<p>
{moment(post.publicationDate).format('dddd, MMMM Do')}
</p>
<hr />
<p className='text-left'>
{post.description || 'Lorem ipsum dolor sit amet, consectetur adipisici elit...'}
</p>
{isEditing
? <div>
<button className='btn btn-lg btn-default' onClick={handleOnCancel}>Cancel</button>
<button type='submit' className='btn btn-lg btn-default' form={formId}>Submit</button>
</div>
: <button className='btn btn-lg btn-default' onClick={handleOnEdit}>Edit</button>
}
</div>
</div>
)
}
export default PostSummaryView
啊。這似乎是一個好主意嘗試。明天我會檢查出來並報告它是如何發生的。謝謝! – Sparragus
我試着實現這個或使用REDX形式。我在使用redux-form的文檔時遇到了困難,所以我放棄了它。我會探索你的未來項目的想法。最後,我最終重構了我的代碼,從功能組件到X類擴展了Component,並且讀取輸入變成了更容易的任務。我也擺脫了
太棒了,聽起來像一個很好的學習經驗 - 任何機會,你可以用你的重構解決方案更新你的問題? – rkd