Rails 5.1アプリでReact 16.1.1(リアクション宝石付き)を使用しています。ブラウザの「戻る」ボタンを使用したときに反応が矛盾した状態で表示される
ブラウザの「戻る」ボタン(firefox/chrome/safariでテスト済み)を使用してこのページに戻るときを除き、特定のページのリアクションコンポーネントは正常に機能します。この場合、表示はコンポーネントの状態と矛盾します。問題のデモをセットアップしました:https://lit-bastion-28654.herokuapp.com/
ステップを再現する:
- が '選択モード' ボタンをクリックしてオン/ Page1の
- こと、それは本当
- クリック 'のページ2'
- 使用する 'のselectionMode' を設定し、 「戻る」ボタンを1ページ目に戻す
- 予想される動作:ボタンが灰色です(コンポーネントがロードされるとselectionModeはfalseにリセットされます)。観察された行動:ボタンはまだ青いですか?そこ
、あなたはselectionMode
は本当だったかのようにボタンは、青であることがわかりますが、インクルードは、ブラウザのプラグインがselectionMode
が偽であることを示して反応します。 Reactブラウザプラグインは、ボタンに「btn-primary」クラス(selectionModeがfalseの場合は正常)を持たないことを示していますが、明らかにDOMにはbtn-primary 'クラス、それは青く見えるので。
これは私のコードです:
page1.html.erb:
<%= react_component("EditableCardList", { editable: true }) %>
editable_card_list.js.jsx:
class EditableCardList extends React.Component {
constructor(props) {
super(props);
this.state = {
selectionMode: false
};
this.toggleSelectionMode = this.toggleSelectionMode.bind(this);
}
toggleSelectionMode() {
this.setState(prevState => ({ selectionMode: !prevState.selectionMode }));
}
render() {
if (this.props.editable === true)
return (
<div>
<div className="row card-buttons">
<div className="col-md-12">
<div className="pull-left">
<ManageCardsButtons
selectionMode={this.state.selectionMode}
toggleSelectionMode={this.toggleSelectionMode}
/>
</div>
</div>
</div>
</div>
)
}
}
manage_cards_buttons.js.jsx :
class ManageCardsButtons extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<span>
<button type="button" className={`btn btn-default btn-sm ${this.props.selectionMode ? 'btn-primary' : ''}`} onClick={this.props.toggleSelectionMode}>Selection mode</button>
{ this.props.selectionMode && <span>selection mode</span> }
</span>
)
}
}
私の質問は:ブラウザで「戻る」を使用した後、ボタンが正しく再レンダリングされていることを確認します(青ではなく灰色で表示されます)。
問題はturbolinksとキャッシュに関連している可能性がありますが、まだ理解できていません。
ページヘッダーに「」タグを含めることによって、[React]ページの[キャッシュを無効にする](https://github.com/turbolinks/turbolinks#opting-out-of-caching)を試してください。 –
@RobertFarleyそれはパフォーマンス上の理由から私が避けたいのですが、うまくいきます。 – vmarquet
最新のバージョンのターボリンクとリアレールの宝石を使用していますか? –