首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态变化的react-modal内容

动态变化的react-modal内容
EN

Stack Overflow用户
提问于 2017-12-18 01:39:01
回答 2查看 4.9K关注 0票数 1

我对react-modal有问题。我有SingleElement的列表,点击后,它应该出现模式窗口与更多的细节被点击的元素。带有数据的JSON被存储为state,而从Modal的内部我找不到方法来获取所需的元素。

下面是render()函数内部的模式:

代码语言:javascript
复制
        <Modal
            isOpen={this.state.modalIsOpen}
            onAfterOpen={this.afterOpenModal}
            onRequestClose={this.closeModal}
            chosenBeer={this.state.chosenBeer}
        >
            <h2> == Dynamically changing title of element == </h2>
            <button onClick={this.closeModal}>X</button>
            <img src="{ == Dynamically changing image == }" />
        </Modal>

        <div id="splashElements">
        {
            this.state.elements &&
            this.state.elements.map((item, index) => {
                return(<SingleElement key={index} name={item.name} href={item.href} image={item.image_url} tagline={item.tagline} onDelete={id => this.onDelete(index)} openModal={elementId => this.openModal(index)}/>)
            })
        }
        </div>

下面是负责显示/隐藏模式窗口的方法:

代码语言:javascript
复制
openModal = (beerId) => {
    this.setState({modalIsOpen: true, chosenBeer: this.state.beers[beerId]});
}

afterOpenModal = () =>{
    // references are now sync'd and can be accessed.
}

closeModal = () => {
    this.setState({modalIsOpen: false});
}
EN

回答 2

Stack Overflow用户

发布于 2017-12-18 02:38:52

你可以做到这两句话。当单击菜单项时,创建了一个将菜单项存储到状态的函数,然后模态可以直接从该状态调用。

我要做的是,让一个附加到listItem的函数来捕获选定的项,并将其发送到自定义的可重用模态组件……

代码语言:javascript
复制
onClick={() => this.handleClick(item)}

handleClick(item) {
 //You would need to create a reusable modal component and import it.
return (
<ReusableModalComponent item={item}
)

}

然后在您的ReusableModalComponent中,您可以通过this.props.item.src...etc访问列表中的所有内容

更新您的示例,使您的代码按原样工作...

代码语言:javascript
复制
this.state.elements.map((item, index) => {
            return(<SingleElement key={index} name={item.name} href={item.href} image={item.image_url} tagline={item.tagline} onDelete={id => this.onDelete(index)} openModal={elementId => this.openModal(index)} onClick={() => this.setState({itemToShow: item, modalIsOpen: !this.state.modalIsOpen}) />)
        })

然后,在您的模式中引用this.state.itemToShow.etc

票数 1
EN

Stack Overflow用户

发布于 2019-07-24 11:02:39

我所理解的是,您在state.elements中呈现了每一项,并且每个<SingleElement/>组件都有一个按钮,单击此按钮后,您想要打开的模式将显示单个元素的值

看起来每个按钮都将使用openModal方法。使用这种方法,我们必须做两件事。首先,更改this.state.modalIsOpen值并将动态值传递给模式体。为此,首先我将向您展示一个javascript魔术。在javascript中

代码语言:javascript
复制
    !!undefined=false
    !!anystring=true  // pretty clear I believe

所以第一步,this.state.modalIsOpen:undefined应该是这样设置的。魔法将在第三步开始。

第二步,您必须将该值传递给singleModal组件。在父组件中,您还呈现了一个包含Modal的组件,因此我将其命名为**singleModal**.

代码语言:javascript
复制
        <singleModal
          modalIsOpen={this.state.modalIsOpen} //i just show the related prop here. 
        />

模态组件的第三步,我认为它是无状态函数组件。在最初的状态中,modalIsOpen的值是undefined.,所以使用javascript,!!props.modalIsOpen的值被设置为false。所以没有出现模态。

第四步,openModal方法激活模型。

代码语言:javascript
复制
    openModal = (beerId) => {
    this.setState({modalIsOpen:this.state.elements[beerId] ,    chosenBeer:this.state.beers[beerId]});
      }

事情是这样的,因为我不知道你的应用程序的布局,我假设beerId与每个<SIngleElement key={} />中的key id值相同。因此,我提取了this.state.elements中的单个元素。

这是魔术的第二部分。我将modalIsOpen设置为this.state.elements[beerId]。请记住,此值是我们为Modal组件中的isOpen属性设置的。

代码语言:javascript
复制
           <Modal
            isOpen={!!props.modalIsOpen}
          />

这次是props.modalIsOpen=this.state.elements[beerId],它是一个字符串。所以!!props.modalIsOpen将会是真的,你的模式将会打开。

最后一步,现在进入模式

代码语言:javascript
复制
    {props.modalIsOpen && <p>{props.modalIsOpen}</p>}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47857790

复制
相关文章

相似问题

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