RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1094468
Accepted
Timofey Melentev
Timofey Melentev
Asked:2020-03-14 07:17:25 +0000 UTC2020-03-14 07:17:25 +0000 UTC 2020-03-14 07:17:25 +0000 UTC

从另一个组件调用导航栏状态更新

  • 772

如何从另一个登录组件重新渲染 NavMenu 组件?我知道不可能从一个组件更改某些特定其他组件的状态?有什么办法吗?

    export class Login extends Component {
    constructor(props) {
        ....
    }

    ...

    async login() {
        var data = {
            login: this.state.login,
            password: this.state.password
        }
        await fetch('sendrequest/login', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(data),
        })
            .catch(error => console.log(error));


    }

    ...

    render() {
        return (
            <Col lg={3}>
                <form>
                    <input type="email" id="emailInput" onChange={this.onChangeLogin} name="passwordInput" placeholder="E-Mail" />
                    <input type="password" id="passwordInput" onChange={this.onChangePassword} name="passwordInput" placeholder="Password" />
                    <Button className="btn btn-primary" onClick={this.login} >Log in</Button>
                </form>
                <Button className="btn btn-primary" onClick={this.refreshToken}>Refresh Token</Button>
            </Col>
        )
    }
}

导航栏本身如下所示:

...

export class NavMenu extends Component {
    static displayName = NavMenu.name;

    async componentDidMount() {
        await this.getProfileData();
    }

    constructor(props) {
        ....
        this.state = {
            collapsed: true,
            firstName: ""
        };        
    }

    ...


    async getProfileData() {
        await fetch('sendrequest/getProfileData', {
            method: "POST",
            headers: {
                'Content-Type': "application/json"
            }
        })
            .then(response => response.json())
            .then(result => this.setState({
                firstName: result.firstName
            }));
    }

    async logout(e) {
        e.preventDefault();
        await fetch('sendrequest/logout', {
            method: "POST",
            headers: {
                'Content-Type': "application/json"
            }
        });
        this.setState({ firstName: undefined });

    }

    render() {
        var loginMenu = <NavLink tag={Link} className="text-dark" to="/login">Log in</NavLink>;
        if (this.state.firstName != null && this.state.firstName != undefined) {
            loginMenu = <React.Fragment><NavItem><NavLink tag={Link} className="text-dark" to="/profile">{this.state.firstName}</NavLink></NavItem>
                <NavItem><NavLink tag={Link} className="text-dark" to="/profle" onClick={this.logout}>Logout</NavLink></NavItem></React.Fragment>;

        }
        return (
            <header>
                <Navbar className="navbar-expand-sm navbar-toggleable-sm ng-white border-bottom box-shadow mb-3" light>
                    <Container>
                        <NavbarBrand tag={Link} to="/">LibraryClient</NavbarBrand>
                        <NavbarToggler onClick={this.toggleNavbar} className="mr-2" />
                        <Collapse className="d-sm-inline-flex flex-sm-row-reverse" isOpen={!this.state.collapsed} navbar>
                            <ul className="navbar-nav flex-grow">
                                <NavItem>
                                    <NavLink tag={Link} className="text-dark" to="/">Home</NavLink>
                                </NavItem>
                                <NavItem>
                                    <NavLink tag={Link} className="text-dark" to="/counter">Counter</NavLink>
                                </NavItem>
                                <NavItem>
                                    <NavLink tag={Link} className="text-dark" to="/fetch-data">Fetch data</NavLink>
                                </NavItem>
                                {loginMenu}
                            </ul>
                        </Collapse>
                    </Container>
                </Navbar>
            </header>
        );
    }
}
javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    qwabra
    2020-03-16T08:50:02Z2020-03-16T08:50:02Z

    小记:

    我建议的方式可能不是“反应方式”,但它简单且有效。
    也许拥有一个外部/全局状态存储会更正确。


    如何从另一个组件重新渲染一个组件?

    • https://ru.reactjs.org/docs/react-component.html#forceupdate

    举个例子:

    import * as React from "react";
    
    
    const COMPONENT: symbol = Symbol();
    
    export default class App extends React.Component {
      tic = 0;
      i = setInterval(() => {
        this.tic++;
      }, 1e3);
      ref = (el: HTMLElement | null) => {
        // @ts-ignore
        if (el) el[COMPONENT] = this;
      };
      render() {
        return (
          <div className="App" ref={this.ref}>
            <span>{this.tic}</span>
          </div>
        );
      }
    }
    
    setInterval(() => {
      const app = document.querySelector(".App");
      if (app && COMPONENT in app) {
        // @ts-ignore
        const component: React.Component = app[COMPONENT];
        component.forceUpdate();
      }
    }, 3e3);
    
    • 1
  2. Zerojle3
    2020-03-18T19:03:30Z2020-03-18T19:03:30Z

    我认为你应该使用纯组件https://ru.reactjs.org/docs/react-api.html#reactpurecomponent

    • 0

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5