gpt4 book ai didi

javascript - 在 sibling 之间存储事件状态

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:11:30 24 4
gpt4 key购买 nike

我在使用两个同级组件之间的事件状态时遇到困难。我有 NavComponent.jsx 和 HeaderComponent.jsx,它们都呈现到 DOM 中的不同区域。

我有一个汉堡包按钮,可以切换事件状态,因此它会变成 X,同时将菜单状态也设置为事件状态以用于导航。我的任务是更改菜单的交互方式,以便在菜单打开时将内容推到一边,这意味着我需要将标题和导航分解为 DOM 中的不同组件。现在,当我希望它们一起工作时,事件状态彼此独立工作。

有人告诉我们要使用 Redux Store,但也无法让它工作。

非常感谢您的帮助。

NavComponent.jsx

import React from 'react';

const Navigation = (props) => (
<nav className={'navigation' + (props.active ? ' slide-in' : '')}>
<ul className="nav">
{
props.items.map(
(item, idx) => {
return (
<NavigationLink key={idx} href={item.href} text={item.text} clickHandler={props.clickHandler} />
);
}
)
}
</ul>
</nav>
);

export default class NavComponent extends React.Component {
constructor (props) {
super(props);
this.state = {
active: false
};
this.navItems = [
{
href: '/app/page1',
text: 'PAGE 1'
},
{
href: '/app/page2',
text: 'PAGE 2'
},
{
href: '/app/page3',
text: 'PAGE 3'
}
];
}

handleClick (e) {
const viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
if (viewportWidth <= 767) {
this.setState({ active: !this.state.active });
}
}

render () {
return (
<Navigation active={this.state.active} items={this.navItems} clickHandler={this.handleClick.bind(this)} />
);
}
}

HeaderComponent.jsx

import React from 'react';
import Logo from '../img/logo.png';
import Logo2x from '../img/logo@2x.png';
import Logo3x from '../img/logo@3x.png';

const HamburgerToggle = (props) => (
<button className={'hamburger hamburger--squeeze' + (props.active ? ' is-active' : '')} onClick={props.clickHandler} type="button">
<span className="hamburger-box">
<span className="hamburger-inner"></span>
</span>
</button>
);

const BrandLogo = () => (
<a href="/app/page1" className="logo-link">
<img width="92" height="29" src={Logo} srcSet={Logo + ' 1x, ' + Logo2x + ' 2x, ' + Logo3x + '3x'} alt="Logo" className="logo" />
</a>
);

export default class HeaderComponent extends React.Component {
constructor (props) {
super(props);
this.state = {
active: false
};
}
handleClick (e) {
const viewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
if (viewportWidth <= 767) {
this.setState({ active: !this.state.active });
}
}
render () {
return (
<div>
<HamburgerToggle active={this.state.active} clickHandler={this.handleClick.bind(this)} />
<BrandLogo />
</div>
);
}
}

最佳答案

store.js

const defaultState = {
headerData
};

const store = createStore(rootReducer, defaultState));

export default store;

rootReducer 这是一个 .js 文件,其中组合了所有的 reducer。

HeaderComponent.js

class HeaderComponent extends React.Component {

constructor...

handleClick...

render...

}

function mapStateToProps (state) {
return {
headerData: state.headerData
};
}

export default connect(mapStateToProps)(HeaderComponent);

NavComponent.js

class NavComponent extends React.Component {

constructor...

handleClick...

render...

}

function mapDispatchToProps (dispatch) {
return bindActionCreators(navActions, dispatch);
}

export default connect(mapDispatchToProps)(NavComponent);

在这种情况下,您的 NavComponent 可以访问文件 navActions 中的所有操作。您需要为此创建一个 js 文件 navActions

当您在 store.js 中创建即时组件时,您的 HeaderComponent 被映射到商店的 headerData。您需要为此创建一个 .js 文件 headerData

NavComponent 中调用的操作触发的 reducer 将更新存储中的 headerData 并且 HeaderComponent 将重新呈现,因为它映射到它。

我强烈建议阅读 Redux Documentation 中的全部基础了解如何编写 ActionsReducers

关于javascript - 在 sibling 之间存储事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45467358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com