私はReact/Reduxを学んでいるところですが、私の単一ページのWebアプリケーションをフレームワーク/パラダイムに変換する際に問題に遭遇しました。私がしようとしているのは、Webアプリケーションの初期状態に、APIリクエストのオブジェクトによって設定される配列があるということです。この配列は「作成」と呼ばれます。私はこれをやりたいので、ウェブサイトの最初のページにAPIからの「作成」を表示することができます。React/Reduxは状態の配列を反復できません
import App from './App';
import './index.css';
import configureStore from './redux/store'
import { Provider } from 'react-redux'
let makesUrl = 'the url to the API'
let cached = cache.get(makesUrl)
let makes = []
// Future cache setup.
if(!cached) {
console.log("NOT CACHED")
}
else {
console.log("CACHED")
}
// Get the makes via API.
fetch(makesUrl).then((response) => {
// Pass JSON to the next 'then'
return response.json()
}).then((json) => {
json.makes.forEach((make) => {
makes.push(make)
})
})
let initialState = {
grids: [],
makes: makes
}
let store = configureStore(initialState)
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
state
とdispatch
小道具にマッピングされ、そのように私のApp.js
ファイルでそれらを必要とするコンポーネントに渡されます:で
import React, { Component } from 'react'
import { connect } from 'react-redux'
import { bindActionCreators } from 'redux'
import './App.css'
import Head from './components/Head'
import Middle from './components/Middle'
import Foot from './components/Foot'
import actions from './redux/actions'
class App extends Component {
render() {
return (
<div className="App">
<div>
<Head />
<div className="middle container">
<Middle actions={this.props.actions} makes={this.props.makes}/>
</div>
<Foot />
</div>
</div>
);
}
}
function mapStateToProps(state) {
return state
}
function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch)
}
}
export default connect(mapStateToProps, mapDispatchToProps)(App)
これは、以下のindex.js
ファイルで見ることができますすべてのポイント、クロム開発ツールでは、私は、API呼び出しが成功し、状態が62オブジェクトを持つmakes: Array[62]
が表示されていることがわかりますが、これらのことが行われるコンポーネントの配列の長さをログコンソール以下に示すように、長さは0であると言います配列の各インデックスは定義されていません。
import React, { Component } from 'react'
class MakeButtons extends Component {
handleClick(event) {
event.preventDefault()
console.log("CLICK")
}
render() {
return(
<div>
{
console.log(this.props.makes.length)
}
</div>
)
}
}
export default MakeButtons
これは私が過去数時間のために把握しようとしてきたものを、本質的であるので、私はしかしでは、アレイ内の各オブジェクトのリンク/ボタンを返すようにforEach
またはmap
機能を使用することができます状態が正常であることを示す開発ツールにもかかわらず、これが機能しない瞬間です。どんな助けや説明も大歓迎です!
あなたのinit関数を呼び出します。だからあなたのコンテナは、次のようになります。さらに、initコールをアクション/レデューサーにして、このプロセスをもっとクリーンにし、アプリケーションが最初のフェッチ呼び出しに基づいてハングする必要がないようにする必要があります。 – ajmajmajma
@ajmajmajmaああ、意味があります!この状況でアクションをディスパッチするには、componentWillMountメソッドが適切でしょうか? – sidp
はい、アプリケーションの読み込み時に一度だけ呼び出されるため、componentWillMountまたはcomponentDidMountです。非同期呼び出しを使用して状態を更新し、それらの状態の1つで呼び出すアクションを作成します。 – ajmajmajma