首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReactJS自定义钩子不能保持它的状态

ReactJS自定义钩子不能保持它的状态
EN

Stack Overflow用户
提问于 2021-01-06 12:58:38
回答 1查看 131关注 0票数 0

主要场景是,我希望有一个定时器来获取新通知,但有时我需要从我定义的间隔周期中获取通知,所以我将其放入useEffect包装器中,并在customHook中创建了一个状态,以便可以从其他组件中更改它,并在useEffect挂钩依赖列表中使用该sate。现在我希望Compo1重新运行useEffect,但是它没有发生.

我有一个带有这个package.json的项目:

代码语言:javascript
复制
{
  "name": "---",
  "version": "1.2.0",
  "private": true,
  "dependencies": {
    "@babel/runtime": "^7.7.7",
    "@date-io/jalaali": "^1.3.11",
    "@material-ui/core": "^4.11.2",
    "@material-ui/icons": "^4.11.2",
    "@material-ui/lab": "^4.0.0-alpha.57",
    "@material-ui/pickers": "^3.2.10",
    "@material-ui/styles": "^4.11.2",
    "animate.css": "^3.7.2",
    "axios": "^0.21.1",
    "clipboard-copy": "^3.1.0",
    "clsx": "^1.1.1",
    "dotenv": "^8.2.0",
    "env-cmd": "^10.0.1",
    "formik": "^2.0.8",
    "i18next": "^17.3.1",
    "jss": "^10.0.0",
    "jss-rtl": "^0.2.3",
    "lodash": "^4.17.15",
    "material-table": "^1.54.1",
    "material-ui-popup-state": "^1.6.1",
    "md5": "^2.2.1",
    "moment": "^2.24.0",
    "moment-jalaali": "^0.9.2",
    "notistack": "^0.9.7",
    "num2persian": "^3.1.3",
    "query-string": "^6.9.0",
    "react": "^17.0.1",
    "react-circular-progressbar": "^2.0.3",
    "react-detect-offline": "^2.4.0",
    "react-dom": "^17.0.1",
    "react-file-icon": "^1.0.0",
    "react-helmet": "^6.1.0",
    "react-i18next": "^10.13.2",
    "react-image": "^2.2.1",
    "react-minimal-pie-chart": "^6.0.1",
    "react-moment": "^0.9.6",
    "react-redux": "^7.2.2",
    "react-router": "^5.2.0",
    "react-router-dom": "^5.2.0",
    "react-scripts": "^4.0.1",
    "react-slidedown": "^2.4.5",
    "react-step-wizard": "^5.3.0",
    "react-toastify": "^5.5.0",
    "redux": "^4.0.5",
    "styled-components": "^4.4.1",
    "url-parse": "^1.4.7",
    "yup": "^0.28.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "prop-types": "^15.7.2",
    "typescript": "4.1.3"
  },
  "resolutions": {
  }
}

我有两个组件和一个自定义钩子,其中包含这些内容。

我的定制钩子:

代码语言:javascript
复制
export const useHeaderNotifUpdater = () => {
    const [signalUpate, dispatchUpdateNotifSignal]          = useState(true);
    console.log(signalUpate);
    return {signalUpate, dispatchUpdateNotifSignal};
};

Compo1:

代码语言:javascript
复制
import {connect} from "react-redux";
import withRouter from "react-router-dom/withRouter";

const Compo1 = ({history, balance, setBalance, setMobileVerifyStatus, userInfo}) => {
    const {signalUpate}                     = useHeaderNotifUpdater();
    const [notifs, setNotifs]               = useState(new Notifs({}));
    const [notifsLoading, setNotifsLoading] = useState(true);

    console.log('Compo1',signalUpate);
    useEffect(() => {

        let timeout = 0;

        const tick = () => {
            clearTimeout(timeout);

            api.notifs.getAllNotifis()
                .then(({data}) => {
                    setNotifs(new Notifs(data));
                })
                .catch(() => {
                })
                .finally(() => {
                    if (notifsLoading)
                        setNotifsLoading(false);
                    timeout = setTimeout(tick, 5000);
                })
        };
        tick();
        return () => {
            clearTimeout(timeout);
        };
        //eslint-disable-next-line
    }, [signalUpate]);

    return <div>{notifs?.length}</div>;

};

const mapStateToProps = state => ({
    balance          : state.auth.balance,
    isMobileNotVerify: state.auth.isMobileNotVerify,
    userInfo         : state.auth.userInfo,
});

const mapDispatchToProps = {
    logout,
    setBalance,
    setMobileVerifyStatus
};

export default connect(mapStateToProps, mapDispatchToProps)(withRouter(Compo1));

Compo2:

代码语言:javascript
复制
const Compo2 = () => {
    const {dispatchUpdateNotifSignal} = useHeaderNotifUpdater();
    const handleUpdateNotifs=()=>{
        dispatchUpdateNotifSignal(prevState => !prevState);
    }
    return <button onClick={handleUpdateNotifs}>Click me!</>;
};
export default Compo2;

的问题是状态是在我的自定义钩子里面,是从外部改变的,但永远不会在Compo1中改变!太奇怪了!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 13:09:27

每次调用自定义钩子useHeaderNotifUpdater()时,它都会创建一个新的状态。您应该只在公共父组件上创建一个状态,或者创建一个具有上下文或管理状态库的全局状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65596222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档