Reactでは、状態はすぐには更新されないため、でコールバックを使用できますsetState(state, callback)
。しかし、Reduxでそれを行う方法は?
を呼び出した後、this.props.dispatch(updateState(key, value))
すぐに更新された状態で何かをする必要があります。
Reactで行うように、最新の状態でコールバックを呼び出す方法はありますか?
Reactでは、状態はすぐには更新されないため、でコールバックを使用できますsetState(state, callback)
。しかし、Reduxでそれを行う方法は?
を呼び出した後、this.props.dispatch(updateState(key, value))
すぐに更新された状態で何かをする必要があります。
Reactで行うように、最新の状態でコールバックを呼び出す方法はありますか?
dispatch()
同期的な活動だと思います。更新された状態は、次の行で利用できるはずです。
thunk
。
回答:
新しい小道具を受け取るには、コンポーネントを更新する必要があります。
あなたの目標を達成する方法があります:
1. componentDidUpdateは、値が変更されているかどうかを確認してから、何かを実行します。
componentDidUpdate(prevProps){
if(prevProps.value !== this.props.value){ alert(prevProps.value) }
}
2. redux-promise(ミドルウェアはpromiseの解決された値をディスパッチします)
export const updateState = (key, value)=>
Promise.resolve({
type:'UPDATE_STATE',
key, value
})
その後、コンポーネントで
this.props.dispatch(updateState(key, value)).then(()=>{
alert(this.props.value)
})
2. redux-thunk
export const updateState = (key, value) => dispatch => {
dispatch({
type: 'UPDATE_STATE',
key,
value,
});
return Promise.resolve();
};
その後、コンポーネントで
this.props.dispatch(updateState(key, value)).then(()=>{
alert(this.props.value)
})
redux-thunk
例dispatch
では、同期しているように使用します。そうですか?
dispatch
は同期していません。なければPromise.resolve()
、this.props.value
まだ古い値を返します。ある種の非同期延期がまだ必要です(setTimeout
たとえば、内部からの参照も機能します)。
TypeError: _this.props.dispatch is not a function
ますか?
Reactの最も重要なポイントは、一方向のデータフローです。つまり、あなたの例では、アクションのディスパッチと状態変更の処理を切り離す必要があります。
以下のようにあなたが考えるべきではありません「私はA
、今X
になっY
て、私はそれを扱う」が、「とき、私は何をしますかX
なったY
とは無関係に、」A
。ストアの状態は、コンポーネントに加えて、複数のソースから更新できます。TimeTravelも状態を変更でき、A
ディスパッチポイントを通過しません。
基本的componentWillReceiveProps
には、@ Utroによって提案されたとおりに使用する必要があることを意味します
componentWillReceiveProps
非推奨になった今、私たちは何をしますか?static getDerivedStateFromProps()
私が知る限り、コールバックを呼び出すことができないため、適切な代替品ではないようです
Hooks APIの場合:
useEffect
小道具を入力として使用します。
import React, { useEffect} from 'react'
import { useSelector } from 'react-redux'
export default function ValueComponent() {
const value = useSelector(store => store.pathTo.value)
useEffect(() => {
console.log('New value', value)
return () => {
console.log('Prev value', value)
}
}, [value])
return <div> {value} </div>
}
subscribe
リスナーを使用でき、アクションがディスパッチされたときに呼び出されます。リスナーの内部では、最新のストアデータを取得します。
subscribe
アクションがディスパッチされたときにのみ発生します。subscribe
API呼び出しがデータを返したかどうかを通知する方法はありません。:D
簡単な解決策として、次のものを使用できます: redux-promise
ただし、redux-thunkを使用している場合は、次のようにする必要があります。
function addCost(data) {
return dispatch => {
var promise1 = new Promise(function(resolve, reject) {
dispatch(something);
});
return promise1;
}
}
thunk
ますか?