2017-02-28 17 views
4
import React, { Component } from 'react' 
import _ from 'lodash' 
import { PageHeader, Row, Col, FormGroup, ControlLabel, Button, FormControl, Panel } from 'react-bootstrap' 

import FieldGroup from '../fieldGroup/fieldGroup' 
import PassagePreview from './preview' 

class PassageDetail extends Component { 
    constructor(props) { 
    super(props) 

    this.handleChange = this.handleChange.bind(this) 

    this.state = { 
     passageDetails: {} 
    } 

    } 

    componentDidMount() { 
    this.props.fetchPassage(this.props.params.passageId) 
    } 

    componentWillReceiveProps(nextProps) { 
    if(nextProps.passageState.passageStatus === 'success') { 
     this.setState({passageDetails: nextProps.passageState.passage}) 
    } 
    } 

    handleChange(e) { 
    let passageDetails = this.state.passageDetails 

    passageDetails[e.target.name] = e.target.value 

    this.setState({passageDetails}) 
    } 

    render() { 
    if(this.props.passageState.passageStatus !== 'success') { 
     return null 
    } 
    return (
     <div> 
     <PageHeader> 
      Create Passage 
     </PageHeader> 
     <Row> 
      <Col md={6}> 
      <FieldGroup 
       type="text" 
       label="Passage Title" 
       name="title" 
       onChange={this.handleChange} 
       value={this.state.passageDetails.title} 
      /> 

      <FieldGroup 
       type="text" 
       label="Passage Author" 
      /> 
      <FormGroup> 
       <ControlLabel>Passage Text</ControlLabel> 
       <FormControl componentClass="textarea" placeholder="textarea" rows="20" /> 
      </FormGroup> 
      </Col> 
      <Col md={6}> 
      <PassagePreview passageDetails={this.state.passageDetails} /> 
      </Col> 
     </Row> 

     <Row> 
      <Col md={6} mdOffset={6}> 
      <Button block bsStyle="primary">Create Passage</Button> 
      </Col> 
     </Row> 
     </div> 
    ) 
    } 
} 

export default PassageDetail 

これは私のコンポーネントです。コンテナは、次のとおりです。還元状態を地元の状態にコピーすることは還元的な哲学に反していますか?

import { connect } from 'react-redux' 
import * as PassagesActions from '../actions/passages' 
import PassageMain from '../components/passage/main' 

const mapStateToProps = (state) => { 
    return { 
    passageState: state.PassageReducer 
    } 
} 

const mapDispatchToProps = (dispatch) => { 
    return { 
    fetchPassages:() => { 
     const params = { 
     url: `${process.env.REACT_APP_API_ENDPOINT}/passages` 
     } 
     dispatch(PassagesActions.fetchData(params, 'passages')) 
    }, 
    fetchPassage: (passageId) => { 
     const params = { 
     url: `${process.env.REACT_APP_API_ENDPOINT}/passages/${passageId}` 
     } 
     dispatch(PassagesActions.fetchData(params, 'passage')) 
    } 
    } 
} 

export default connect(
    mapStateToProps, mapDispatchToProps 
)(PassageMain) 

だから、あなたは私のcomponentDidMountで、私は(Reduxの経由)API呼び出しをやってるとcomponentWillReceivePropsに、私は私の地元の状態にそれをコピーしてることがわかります。私が自分のpassageに変更を加えると、それがコンポーネントレベルで完了し、まだ作成されていないオブジェクトreduxをそのオブジェクトに戻すことができるという考えがあります。

これは還元哲学の中で受け入れられますか?私はまだreduxの周りに私の頭をラッピングしているので、この質問が意味をなさない場合はお詫び申し上げます。

答えて

3

その他のコメントは、いくつかの点を強調していますが、大文字と小文字を区別しています。 http://redux.js.org/docs/faq/OrganizingState.html#organizing-state-only-redux-stateでReduxのよくある質問質問ごと:

ローカルコンポーネントの状態を使用して結構です。開発者としては、アプリケーションを構成する国の種類と、各国家がどこに住んでいるのかを判断するのはあなたの仕事です。あなたのために働く残高を見つけて、一緒に行く。

再来に置かれるべきデータの種類determingのための親指のいくつかの共通のルール:

  • は、このデータについてのアプリケーション・ケアの他の部分ですか?
  • この元のデータに基づいてさらに派生データを作成する必要がありますか?
  • 複数のコンポーネントを駆動するために同じデータが使用されていますか?
  • この状態を特定の時点(つまり、タイムトラベルのデバッグ)に戻すことができますか?
  • データをキャッシュしますか(つまり、データを再要求するのではなく、すでに存在する状態を使用しますか?)

あなたは結果とアクションをディスパッチする前に、「一時的なデータ」領域としてローカルコンポーネントの状態を使用したいのであれば、それは大丈夫です。

1

これを行うためのより多くの「Redux」方法は、状態を更新するためにアクションをストアにディスパッチし、あなたがコンポーネントであることをリデュースするようにします。あなたがここにいるものは良い習慣とはみなされません。

コンポーネントの状態がストアと同期しなくなるので、ストアが更新され、再レンダリングがトリガーされた場合、コンポーネントは新しい小道具を受け取ることがあります。 state.PassageReducer)、ローカルの状態を上書きします。

Unidirectional Data Flowのreduxドキュメントと、add new todosのtodoの例をご覧ください。

2

あなたはアプリケーションの状態を保存し集中管理するためのアーキテクチャとフレームワークを持っているので、それを使用する必要があります。あなたがアプリケーションの状態を分散させているコンポーネントの状態を使用する場合、遅かれ早かれ、あなたは災害を起こすでしょう。 Reduxアーキテクチャーにはできるだけ固執してください。小さなUIの細部にのみコンポーネント状態を使用するか、それ以上のものを使用しないでください。

還元剤を調べるのに役立つかもしれませんが、既にpassagesのコレクションをReduxストアに保持している場合は、コンポーネント状態は必要ありません。

すでにpassageに関する基本情報があり、そのコンポーネントのサーバーからさらにロードする必要がある場合は、その情報が既にあるかどうかを示すフラグが必要です。情報は必要な場合にのみ表示されます。

componentWillReceivePropsを使用する必要はありません。アクションを実行するだけで、アクションが完了したらそれをレデューサーで更新してください。コレクションには継承があり、それをコンポーネントに渡す必要があります(idだけでなくすべてのもの)。

Reduxは非常に低レベルのフレームワークであり、あなたに多くの自由を与えます。あなたは正しい決定を作っているかどうかを疑う場合は、常に心に留めておく:

  • アプリケーションに関連するすべての情報は、Reduxのストアに行くどのような方法でアプリケーションに影響を与え
  • ものはアクションです
  • リアクトコンポーネントは、利用者から収集した情報、他

何もあなたのコンポーネントのみ小道具を受けるべきであるということであることに注意する別のもので、情報や火災Reduxのアクションを表示しますそれは必要なerties。あなたはそれを完全にOKであるかもしれない減速機全体に渡していますが、コンポーネントに影響を与えない減速機のデータがたくさんある場合は、Reactが強制的にコンポーネントを更新するときにパフォーマンスが低下しますそうする必要はありません。

関連する問題