私は説明できないReactコンポーネントで本当に奇妙な動作に直面しました。子コンポーネントは関数のプロパティなしでは更新されません
これが私のアプリのバージョンです縮小さ:
class Child extends React.Component {
componentDidUpdate(prev) {
if (!prev.isActive && this.props.isActive) {
console.log('activated', this.props.title);
}
}
render() {
return (
<span
className={this.props.isActive ? 'child active' : 'child'}
onClick={this.props.onClick}
>
{this.props.title}
</span>
);
}
}
const Child1 = reactRedux.connect((state, props) => ({
isActive={props.isActive('Child1')}
onClick={() => props.activate('Child1')}
title="Child1"
}))(Child);
const Child2 = reactRedux.connect((state, props) => ({
isActive={props.isActive('Child2')}
onClick={() => props.activate('Child2')}
title="Child2"
}))(Child);
class Root extends React.Component {
state = { active: null };
activate = (active) => {
if (!this.isActive(active)) {
this.setState({ active });
}
};
isActive = active => this.state.active === active;
renderChild = (ChildComponent, i) => (
<ChildComponent
activate={this.activate}
isActive={this.isActive}
key={i}
/>
);
render() {
const children = [Child1, Child2];
return (
<reactRedux.Provider store={this.props.store}>
<div>{children.map(this.renderChild)}</div>
</reactRedux.Provider>
);
}
}
const reducer = (state, action) => ({});
const store = redux.createStore(reducer);
ReactDOM.render(<Root store={store} />, document.getElementById('root'));
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/5.0.6/react-redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.7.2/redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
[OK]を、問題は、子コンポーネントのcomponentDidUpdate
が呼ばれなかったこと、です。しかし、私がすべての子プロパティに関数を含むプロパティを渡すと、それは魅力のように機能します。
renderChild = (ChildComponent, i) => (
<ChildComponent
activate={this.activate}
isActive={this.isActive}
key={i}
asfafasg={() => {}}
/>
);
その行動はから来たんどこを知っている誰もがありますか?それは本当に奇妙です。私はすでにwebpack builderなどを再起動して、これが奇妙なキャッシングの問題ではないことを確認しました。
スパンをクリックすると、ルートコンポーネントの状態は正しく更新されますが、子のcomponentDidUpdateメソッドは正しく更新されません。
私はリアクタンスレスキューの接続機能を使わずにテストしています。だから、それはconnect関数の問題だと思われます。
意味したのですか?ところで、あなたはどこで 'activate'と呼んでいますか? –
申し訳ありませんが、この例ではactivateメソッドを呼び出すのを忘れていました。私の質問を更新しました。スパンをクリックすると、ルートコンポーネントの状態は正しく更新されますが、子のcomponentDidUpdateメソッドは更新されません。 –
実際のコードは再現されていますが、このエラーが発生してここでは縮小された例だけです。 :/ –