useState()
は、新しい状態変数(通知)を未定義にします。
_const Notifications = (props) => {
const [notifications, setNotifications] = useState(props.notifications);//notifications = undefined, props = {notifications: Array(0)}
useEffect(() => {
if (props.notifications) {
setNotifications(props.notifications);
}
}, [props.notifications]);
// do stuff....
_
通知が_[]
_であり、その後_props.notifications
_が変更されたときにsetNotifications()
で更新されることを期待しています。 _props.notification
_はreduxストアからのものです。これが何かを変更するかどうかはわかりませんが、初期状態を設定しました。
_const initialState = Immutable.fromJS({
notifications: [],
});
_
なぜ未定義になるのかわからない...
編集:タイプミスとテストコードを取り除きました
初期状態を適切に設定するには、引数としてuseState
に渡す必要があるため、次のようにします。
const [notifications, setNotifications] = useState([]);
また、どこかにprops.notifications
を設定してもしなくても、コンポーネントになんらかのデフォルト値があることに依存している場合は、次のようにその場所に設定する必要があります。
const Notifications = ({ notifications = [] }) => {
そして最後ですが、useEffect
の依存関係リストで配列を使用すると、たとえばnotifications
構造が同じ(同じアイテム、同じ長さ)のままである場合など、いくつかの望ましくない副作用がありますが、新しい配列になり、useEffect
は浅い比較しか行わないため、キャッシュを見逃します。配列自体ではなく、何らかのハッシュ関数の使用を検討してください(例:JSON.stringify
)