2017-05-24 5 views
1

次のES6構文を使用して、リセットが呼ばれたときに状態をデフォルトの状態に戻す最善の方法は何ですか?状態をES6のデフォルトの小道具に戻す

reset() { 
    if (this.mounted) { 
    this.setState(()=> { 
     const newState = { 
     anchorStandards: {writing: [], reading: []}, 
     gradeLevels: {gradeLevels: []} 
     } 
     this.props.onFilterChange(newState) 
     return newState 
    }) 
    } 
} 

しかしがある場合、私は疑問に思って:または別のソリューションをシームレスに

class XYZ extends React.Component { 
    constructor() { 
    super(), 
    this.state = { 
    ... 
    } 
    } 

    reset() { 
    //I need to revert to default props here 
    } 
} 

XYZ.propTypes = { 
    ... 
} 

XYZ.defaultProps = { 
    ... 
} 

export default XYZ 

技術的に私は次のようにリセットを実装することができます(私はforceUpdateは良い選択肢ではないことを読んで)コンポーネントを再ロードされますこれを呼び出す方法.defaultPros

答えて

0

getDefaultState(props)関数を実装し、constructor(props)reset()の両方で呼び出します。例えば

getDefaultState(props) { 
    return { importantState: props.importantState } 
} 

constructor(props) { 
    this.state = this.getDefaultState(props) 
} 

reset() { 
    this.setState(this.getDefaultState(this.props)) 
} 

このアプローチでは、親コンポーネントは何を知っている必要はありません。また、関連する小道具や初期状態を決定するコードは一度だけ書かれています。

+0

私はXYZ.defaultPropsを使用していた理由は次のとおりです。 warning.js:36警告:getDefaultPropsプレーンJavaScriptクラスであるXYZで定義されていました。これは、React.createClassを使用して作成されたクラスに対してのみサポートされています。代わりにdefaultPropsを定義するには、静的プロパティを使用します。私がgetDefaultStateを使用していた場合、その構文を使用することができます。 –

+0

まあ、はい。これは、古いReactバージョンでは 'getDefaultProps()'が存在していたので、あなたが間違っていると思っているので警告します。 **これは念頭に置いておいてください**:もしあなたが 'reset()'で行っているように、コンポーネントがそれ自身のデータを変更しているなら、 'props'ではなく' state'と呼ばれるべきです。 'props'、内部決定情報' state' – slezica

0

この簡単な方法をお試しください。

https://jsfiddle.net/pablodarde/5fhdLcey/

親要素

class Main extends React.Component { 
    constructor() { 
    super(); 
    this.state = { 
     name: "Pablo", 
    }; 
    this.reset = this.reset.bind(this); 
    } 

    reset() { 
    this.setState({ 
     name: undefined, 
    }); 
    } 

    render() { 
    return(
     <div> 
     <HelloWidget name={this.state.name} reset={this.reset} /> 
     </div> 
    ); 
    } 
}; 

子要素

class HelloWidget extends React.Component { 
    constructor() { 
    super(); 
    } 

    render() { 
    return(
     <div> 
     <h2>{this.props.name}</h2> 
     <button onClick={this.props.reset} >Reset</button> 
     </div> 
    ); 
    } 
} 

HelloWidget.propTypes = { 
    name: React.PropTypes.string, 
    reset: React.PropTypes.func, 
} 

HelloWidget.defaultProps = { 
    name: "Friend", 
} 
関連する問題