【问题标题】:React : How to display a modal popup only for that specific divReact:如何仅针对该特定 div 显示模式弹出窗口
【发布时间】:2019-06-14 01:37:31
【问题描述】:

为了更清楚,基本上我想做的就像亚马逊一样

会有一堆产品,一旦你点击产品,只有那个产品和它的细节会显示在Popup Modal上。

在我的例子中,我在一个数组中存储了 3 个数据,我已经将它映射出来,它创建了 3div 和 3Modal Popup,每个都带有按钮。

单击第一个 div 的按钮后,我希望只为第一个 div 打开模式。

但是现在当我点击按钮时所有 3 Modal Popup。

我是 React 新手,我可以在 JQuery 和 Javascript 中做同样的事情,但我无法在 React 中实现。

或者有更好的方法吗? Like 而不是循环创建 3modal popup 我们可以只创建一个modal popup,它将显示正在单击哪个按钮的特定div的数据?

我当前的代码:

App.js,我在哪里创建了数组

Product.Js 它被映射到 3div 并且还有模态弹出窗口

如果你们需要更多详细信息,请告诉我

谢谢你们。

3 使用数组中的数据创建的 div

但是当我点击任何按钮时,弹出所有 div 的弹出窗口,这就是问题

【问题讨论】:

  • 全局状态呢?你使用 mobX 或 redux,还是新的 react 上下文 API...?
  • 对我来说,modal 应该是单独的组件,并且生成它取决于值 showModal。你可以在没有 showModal: boolean 的情况下做它 - 只需调用 jQuery modal,但它很乱。一般来说,jQuery 并不是真正的反应式。你可以使用 react-bootstrap 包——它不使用 jQuery,它是响应式的。
  • @Zydnar ,我是 React 新手,所以我没有使用 redux .etc。它只是反应而已
  • 好的,但是我将如何弹出特定的 div?让我张贴图片
  • Reactive 表示变量更改 --> 所有依赖的视图更改/操作都会被触发。所以你可以使用继承自 React.Component 的方法 - componentReceivedProps - 如果showModal 是你运行你的jQuery函数的道具。或者干脆不使用 state 中的这个 prop,让 jQuery 处理一些 HTML。因此,在 Product 组件中创建带有模态内容的
    并在 getModal 上运行,传统上是 jQuery。所以
    需要有它的 id 所以运行它$(id).modal('open');

标签: javascript reactjs jsx


【解决方案1】:

当然,所有的模态都会同时弹出。所有模态都使用完全相同的状态,即this.state.showModal。一旦它得到true,那么一切都会弹出。如果您仍然喜欢这样的 3 个模态。我建议您将showModal 的值设为 JSON 值。也许是这样的:

state = {
    showModal: {}
}

那么对于getModal()函数:

getModal = value => {//still using variable from `data.id`
    let key_to_update = {};
    key_to_update[value] = true;
    this.setState( {
        showModal: Object.assign( {}, this.state.showModal, key_to_update )
    } );
}



那么对于<Modal/> 应该是这样的:

<Modal show={this.state.showModal[data.id]} onClick={()=> this.hideModal(data.id)}/>



要隐藏模态,您可以与 getModal() 相反,如下所示:

hideModal = value => {//still using variable from `data.id`
    let key_to_update = {};
    key_to_update[value] = false;//Just different on this
    this.setState( {
        showModal: Object.assign( {}, this.state.showModal, key_to_update )
    } );
}

如果您仍然感兴趣并且在实现它时遇到问题,我可以帮助您创建一个工作演示。因为我并没有真正测试代码,只是根据我的经验和快速分析来制作它。但是,就我个人而言,我喜欢为这种情况使用一个 Modal。只需设置“产品详细信息”的单个“状态”,然后从单个 Modal 中读取该“状态”,然后同时显示。

==== 演示:多模态元素技术 =====

就像您的评论一样,因为您一次只需要显示一个模式,那么它会容易得多。我们不需要像上面那样有多个真/假条件。我们可以使用data.id 作为对showModal 状态的真/假检查,如下所示:

class Product extends Component {
  state = {
    showModal: 0
  };

  getModal = value => {
    this.setState({ showModal: value });
  };

  hideModal = value => {
    this.setState({ showModal: 0 });
  };

  render() {
    return (
      <div className="container">
        {this.props.data.map((data, key) => (
          <div key={key} className="small">
            <p>Namsse: {data.name}</p>

            <button onClick={() => this.getModal(data.id)}>Popup</button>

            <Modal
              show={this.state.showModal === data.id}
              onHide={() => this.hideModal(data.id)}
              name={data.name}
            />
          </div>
        ))}
      </div>
    );
  }
}

工作演示:https://codesandbox.io/s/pkjvy72mw0



===演​​示:单模态元素技术===

您也可以只有一个 &lt;Modal/&gt; 元素,如下所示:

class Product extends Component {
  state = {
    showModal: false,
    dataModal: {
      name: ""
    }
  };

  getModal = data => {
    this.setState({ showModal: true, dataModal: data });
  };

  hideModal = () => {
    this.setState({ showModal: false });
  };

  render() {
    return (
      <div className="container">
        {this.props.data.map((data, key) => (
          <div key={key} className="small">
            <p>Namsse: {data.name}</p>

            <button onClick={() => this.getModal(data)}>Popup</button>
          </div>
        ))}

        <Modal
          show={this.state.showModal}
          onHide={this.hideModal}
          name={this.state.dataModal.name}
        />
      </div>
    );
  }
}

工作演示:https://codesandbox.io/s/53x7m726xk

【讨论】:

  • YUS 没错,单模态正是我想要的,但它即将到来 3,因为有 3 个 div,所以如果有 100 个 div,那么就会有 100 个模态,这不是正确的做法它。因此,如果您能给我展示一个适用于所有 div 的单一模型的工作演示,那就太好了。非常感谢
  • 只需制作一个尝试使用您现有代码的演示。请检查我的答案的更新。将尝试为单个&lt;Modal/&gt;方式制作DEMO。
  • 只需使用 Single &lt;Modal/&gt; 元素方法添加另一个演示。如果您对我的代码有任何疑问,请告诉我。谢谢。
  • 你太棒了,非常感谢你花时间在我身上
  • 没问题。反正我喜欢编码:)。关于this.setState({ showModal: true, dataModal: data }); dataModal 部分只是从this.props.data.map((data, key) 的循环中复制data 记录。所以dataModal 的值类似于:{ id: 1, name: "Thanveer" },然后你将它作为props 传递给&lt;Modal/&gt; 组件并在那里渲染。
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多