javascript - React - 一个事件处理程序来切换多个相似元素之一

标签 javascript reactjs

我正在尝试通过重建一个代理网站来练习 React。我正在研究一个包含员工图像的部分,单击其中一张图像会以模式打开相关员工简介。图像和 BIOS 位于单独的包含 div 中。

感觉我应该能够编写一个事件处理程序,根据单击的图像查找并打开相关的生物(也许使用数据属性之类的东西?),但我不知道我要做什么需要添加。

目前我只有一个点击处理程序来切换“事件”状态。然后将该状态添加为类名以切换模式是否显示。当然,问题在于它不区分 BIOS,因此无论单击哪个 Bio,它们都会显示。

如果它有用,这是我的“员工简介”组件:

const StaffBio = (props) => {
return (
    <div className={`teamMemberOverlay ${props.active}`} onClick={props.onClick}>
        <div className="teamMemberExpanded">
            <h6>{props.name}</h6>
            <div className="seperator"></div>
            <p className="title">{props.title}</p>
        </div>
    </div>
);
}

它的使用方式如下:

<StaffBio name="NAME HERE" title="TITLE HERE" active={this.state.active} onClick={this.showBio} />

到目前为止,我已将图像设置如下:

<img src={PaulIllustration} className="staffPhoto" onClick={this.showBio} />

最后,我的事件处理程序:

showBio() {
    let toggle = this.state.active === 'is-active' ? '' : 'is-active';
    this.setState({active: toggle});
}

最佳答案

class AboutUsSlider extends Component {
  constructor(props) {
    super(props);
    this.showBio = this.showBio.bind(this)
    this.next = this.next.bind(this)

    this.state = { active: null }
}

next() {
  this.refs.slider.slickNext()
}

showBio(id) {
  this.setState({active: id});
}
hideBio(){
  this.setState({active: null});
}

render() {
  var settings = {...}
  const people = [{name: 'Paul', title: 'some title'}, {name: 'Ben', title: 'other'}, ...];

return (
  <div>
  <Slider ref="slider" {...settings}>
    <div className="sliderPage">
      <h2>Meet our team</h2>
      <div className="seperator"></div>
      <div className="teamPhotos">
      { // When setting the index, you should use something unique, I'll use the name here.
       people.map((p, index) => 
           <img key={p.name} src={`${p.name} + 'Illustration'`} className="staffPhoto" onClick={() => this.showBio(index)}) />
      }
      </div>
      <Button BGColor="#009ECC" text="Our process" onClick={this.next} />
    </div>
  </Slider>
  { this.state.active && <StaffBio name={people[this.state.active]} title={people[this.state.active].title} onClick={this.hideBio}/>
  </div>
  )
}

已编辑

您可以执行以下几项操作。

每个人可能都有一个 ID 来识别它。因此,您可以将 showBio 修改为如下所示:

showBio(id) {
  this.setState({ active: id })
}

这样,您就可以了解当前在您所在州处于事件状态的人。

您还需要更改您的img

<img src={PaulIllustration} className="staffPhoto" onClick={() => this.showBio(PaulId)} />

其中 PaulId 对于每个人来说都是不同的。

还有你的StaffBio:

<StaffBio name="NAME HERE" title="TITLE HERE" active={this.state.active == personId} onClick={this.showBio} />


const StaffBio = (props) => {
  return (
  <div className={`teamMemberOverlay ${props.active ? 'is-active' : ''}`} onClick={props.onClick}>
    <div className="teamMemberExpanded">
        <h6>{props.name}</h6>
        <div className="seperator"></div>
        <p className="title">{props.title}</p>
    </div>
  </div>
  );
}

关于javascript - React - 一个事件处理程序来切换多个相似元素之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44548835/

相关文章:

reactjs - Apollo 的 MockedProvider 没有明确警告丢失的模拟

javascript - 简单的 React.render() 给出错误

css - 如何使用 reactjs 逐渐在入口 SVG 图像上制作动画?

javascript:如何从对象动态返回函数

javascript - 迭代之前调用异步每个回调

javascript - 在 Javascript 中将非 unicode 二进制字符串转换为字节数组

javascript - 如何使用 Google 协作平台的 Google App 脚本创建动态组件?

javascript - 在 angularjs 工厂方法中添加事件监听器未按预期工作

javascript - 使用react-redux时,prevProps和this.props将始终在componentDidUpdate中返回相同的值

javascript - 控制台抛出未终止的 JSX 内容错误