首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击按钮时,id总是相同的。

单击按钮时,id总是相同的。
EN

Stack Overflow用户
提问于 2018-11-26 01:23:01
回答 1查看 30关注 0票数 0

我使用的是“反应-反应-模式”的npm方案。

源代码在这里

如果你克隆并运行“npm启动”

您将看到这样的虚拟UI

代码语言:javascript
复制
header
click me objId: 43
click me objId: 42
click me objId: 41

当我单击43、42、41时,console.log总是输出41。我希望它能单独输出43,42,41。

这和onclick有关吗?它需要用onclick结束吗?

这是主要代码

代码语言:javascript
复制
import React, { Component } from 'react';
//import logo from './logo.svg';
//import './App.css';

import Modal from 'react-responsive-modal';

class App extends Component {

    constructor(props) {
        super(props);

        this.state = {
            isModelOpen: false
        }
    }

    mydata() {
        let arr = [
            {
                id: 43,
                date: "Nov 26, 2018",
            },
            {
                id: 42,
                date: "Nov 26, 2018",
            },
            {
                id: 41,
                date: "Nov 26, 2018",
            },
        ];

        return arr;
    }

    modalNoButton() {
        this.setState({ isModelOpen: false });
    }

    modalYesButton(objId, date) {

        // test
        console.log('-- modalYesButton --');
        console.log(objId);
        console.log(date);
        this.setState({isModelOpen: false});
    }

    onOpenModal() {
        this.setState({ isModelOpen: true });
    }

    onCloseModal() {
        this.setState({ isModelOpen: false });
    }

    createActionHtml(objId, date) {

        // test
        //console.log('-- createActionHtml --');
        //console.log(objId);

        let {isModelOpen} = this.state;
        let pointerStyle = {
            cursor: 'pointer'
        };

        let bigMarginStyle = {
            marginTop: '30px'
        }

        return (
            <div>
                <div className='myPointer'>
                    <a onClick={this.onOpenModal.bind(this)} style={pointerStyle}>click me objId: {objId}</a>
                </div>
                <Modal open={isModelOpen} onClose={this.onCloseModal.bind(this)}>

                    <div style={bigMarginStyle}>
                        popup
                    </div>

                    <div className='row'>
                        <div className='col xs-6'>
                            <button
                                onClick={() => {this.modalYesButton(objId, date)}}
                            >
                                Yes
                            </button>
                        </div>

                        <div className='col xs-6'>
                            <button
                                onClick={this.modalNoButton.bind(this)}
                            >
                                No
                            </button>
                        </div>
                    </div>
                </Modal>
            </div>
        );
    }

    myhistory() {
        let arr = this.mydata();
        let html = arr.slice(0, 3).map((obj, index) => {
            let objId = obj.id;
            let date = obj.date;
            let actionHtml = this.createActionHtml(objId, date);

            return (
                <div key={index}>
                    {actionHtml}
                </div>
            );
        });

        return html;
    }

    render() {
        return (
            <div className="App">
                <header className="App-header">
                    header
                </header>

                {this.myhistory()}
            </div>
        );
    }
}

export default App;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 01:46:57

问题是,您实际上是在另一个上面呈现三个modal,每个项目一个,最后一个id 41的模态位于顶部。状态isOpenModal是一个单一的布尔值,它确定是否所有三个modals都呈现,但是您确实想要跟踪这三个模型中哪个是打开的,所以我将用openModalId替换isOpenModal

下面是一个工作的代码框:https://codesandbox.io/s/j388zzyow3

代码语言:javascript
复制
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
import Modal from "react-responsive-modal";

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      openModalId: null
    };
  }

  mydata() {
    let arr = [
      {
        id: 43,
        date: "Nov 26, 2018"
      },
      {
        id: 42,
        date: "Nov 26, 2018"
      },
      {
        id: 41,
        date: "Nov 26, 2018"
      }
    ];

    return arr;
  }

  modalNoButton() {
    this.setState({ openModalId: null });
  }

  modalYesButton(objId, date) {
    // test
    console.log("-- modalYesButton --", objId);
    this.setState({ openModalId: null });
  }

  onOpenModal(objId) {
    this.setState({ openModalId: objId });
  }

  onCloseModal() {
    this.setState({ openModalId: null });
  }

  createActionHtml(objId, date) {
    // test
    // console.log('-- createActionHtml --', objId);

    let { isModelOpen } = this.state;
    let pointerStyle = {
      cursor: "pointer"
    };

    let bigMarginStyle = {
      marginTop: "30px"
    };

    return (
      <div>
        <div className="myPointer">
          <a onClick={() => this.onOpenModal(objId)} style={pointerStyle}>
            click me objId: {objId}
          </a>
        </div>
        <Modal
          open={this.state.openModalId === objId}
          onClose={this.onCloseModal.bind(this)}
        >
          <div style={bigMarginStyle}>popup</div>

          <div className="row">
            <div className="col xs-6">
              <button
                onClick={() => {
                  this.modalYesButton(objId, date);
                }}
              >
                Yes
              </button>
            </div>

            <div className="col xs-6">
              <button onClick={this.modalNoButton.bind(this)}>No</button>
            </div>
          </div>
        </Modal>
      </div>
    );
  }

  myhistory() {
    let arr = this.mydata();
    let html = arr.slice(0, 3).map((obj, index) => {
      let objId = obj.id;
      let date = obj.date;
      let actionHtml = this.createActionHtml(objId, date);

      return <div key={index}>{actionHtml}</div>;
    });

    return html;
  }

  render() {
    return (
      <div className="App">
        <header className="App-header">header</header>

        {this.myhistory()}
      </div>
    );
  }
}

export default App;

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53473663

复制
相关文章

相似问题

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