私は、配列からブックのリストをレンダリングし、別のブックオブジェクトを配列にプッシュするフォームを持つ、基本的なReactアプリケーションを構築しています。私は本の配列を変更することはPost
コンポーネントを再レンダリングさせる原因となる小道具への変更だと思っていましたが、私はリンクをしっかりと動かすことによって手動で強制しない限り、Post
を再レンダリングすることはできません。私は書籍の配列だけでなく関連するすべてのコンポーネントを添付していると思います。私は、React環境をセットアップするためにcreate-react-appを使用しました。 反応バージョン - 15.4.1。何かお手伝いいただきありがとうございました!基本的なReactアプリケーションでのコンポーネントの再レンダリングに関する問題
編集: 私は少しをリファクタリングし、すべてがより明確にするためにgithubのレポを作成しました。
import React from 'react'
import ReactDOM from 'react-dom'
import {Router, Route, IndexRoute, hashHistory} from 'react-router'
import App from './App'
import Display from './Display'
import Content from './Content'
//stylesheet
import './index.css'
//import posts array
import postsArray from './postsArray'
ReactDOM.render(
<Router history={hashHistory}>
<Route path="/" component={App}>
<IndexRoute component={Display} entries={postsArray}></IndexRoute>
<Route path="view/:id" component={Content} entries={postsArray}></Route>
</Route>
</Router>,
document.getElementById('root')
);
import React, {Component} from 'react'
import Post from './Post'
class Display extends Component {
constructor(props) {
super(props)
this.handleSubmit = this.handleSubmit.bind(this)
}
handleSubmit(event) {
this.props.route.entries.push({
title: this.titleInput.value,
author: this.authorInput.value,
body: this.bodyText.value
})
event.preventDefault()
}
render() {
return(
<div>
<Post entries={this.props.route.entries}/><br /> <br />
<form onSubmit={this.handleSubmit}>
<label>
Title:<br />
<input type={"text"} ref={(titleInput) => this.titleInput = titleInput} className="input" />
</label><br />
<label>
Author:<br />
<input type="text" ref={(authorInput) => this.authorInput = authorInput} className="input" />
</label> <br />
<label>
Body:<br />
<textarea ref={(bodyText) => this.bodyText = bodyText} className="textAreaInput"/>
</label> <br />
<input type="submit" value="Submit" />
</form>
</div>
)
}
}
export default Display
import React, {Component} from 'react'
import {Link} from 'react-router'
class Post extends Component {
constructor(props) {
super(props)
console.log("insinde post initial", this.props.entries)
}
render() {
return (
<div className="postsWrapper">
{this.props.entries.map((entry, index) => (
<div key={index} className="divMargin">
<Link to={"view/" + index } className="postLink">
<h1 className="postH titleFont">{entry.title}</h1>
<h2 className="authorFont authorMargin">{entry.author}</h2>
</Link>
</div>
))}
</div>
)
}
}
export default Post
ルーターでの「エントリ」の使用は私には珍しいようです。あなたはなぜこのようにポスト配列を配置したいのかをさらに説明できますか? –
そして、あなたはポスト配列をロギングしているので、ポストコンポーネントで配列小道具を正常に更新できますか? –
私はルータから小道具として配列を渡すことを任意に決めました。それは最善の決定ではないかもしれませんが、私がディスプレイコンポーネントから小道具としてエントリーを渡しても、私は同じ問題を抱えます。また、Postコンポーネントは実際には各Postのレンダリングだけを担当しており、更新が行われたフォームからは切り離されていますが、その変更が原因でまだ再レンダリングする必要があります。 –