【问题标题】:How to call a function with an argument after the submitting button in the popup window was clicked?单击弹出窗口中的提交按钮后如何调用带参数的函数?
【发布时间】:2021-02-15 15:09:36
【问题描述】:

在 React 中,我创建了一个包含本地弹出状态的组件。在 onClick 处理程序的帮助下,我更改了本地状态以显示弹出窗口。 Popup 组件又包含确认按钮。我只想在单击确认按钮后调用函数 deleteItem 。但我不知道该怎么做。在下面的代码中,项目在弹出窗口出现后立即被删除,但只有当我按下 Popup 组件中的按钮时才需要删除它。如果我理解正确,当弹出窗口出现时组件的状态会发生变化,我必须将它传给 MainComponent,只有在这种情况下才会调用函数 deleteItem。

import {deleteItem} from './item-reducer';

const MainComponent = ({items}) => {
 const [visiblePopup, setVisiblePopup] = useState(false);
    return( 
       {items.map(item => <li key={item.id}></li>
       <img onClick={() => {
         setVisiblePopup(true);
         deleteList(item.id) // I have to call this function after the button 
         in the Popup component is pressed
        }}
       />
    )}
   <Popup setVisiblePopup={setVisiblePopup}
  )
}

Popup.jsx
<div onClick={() => setVisiblePopup(false)} /> 
    Confirm
</div>

我必须完成的事情 1) 我点击 img 并弹出窗口 2) 我按 '确认' 3) 函数 deleteItem 被调用 4) 弹出窗口消失。

【问题讨论】:

  • onClick={ () =&gt; { setVisiblePopUp(true); deleteList(item.id); } } 应该做你的情况,你只是在错误的地方错过了一个大括号 =)
  • @Halil Cakar 谢谢,我修好了。但事实并非如此。我的意思是,只有在单击弹出窗口中的按钮后,我才应该删除列表(item.id)。
  • @brad_fresh 使用方括号语法onClick={() =&gt; [setVisiblePopup(true), deleteList(item.id)]
  • 您好,请在Minimal, Complete, and Reproducible 示例中包含all 相关代码。我没有看到任何操作被分派到商店,没有组件连接到商店,也没有看到 Popup(不是完整的、有效的组件代码)与 MainComponent 的关系。如果Popup 是一个单独的组件,它不能调用MainComponentsetVisiblePopup 状态更新函数。我们需要更多背景信息。
  • @Drew Reese 立即查看!我试图添加更广泛的描述。

标签: reactjs components


【解决方案1】:

如果我理解正确,这就是你要找的东西?

const MainComponent = ({items}) => {
    const [modalState, setModalState] = useState({
        display: false,
        deleteItemId: undefined
    });

    const modalCallback = useCallback((deleteItemId)=>{
        deleteItem(deleteItemId)
        setModalState({ display: false, deleteItemId: undefined })
    },[])

    
    return( 
        <Fragment>
            {
                items.map(item => (
                    <Fragment>
                        <li key={item.id}></li>
                        <img onClick={() => setModalState({ display: true, deleteItemId: item.id })} />
                    </Fragment>
                ))
            }
            <PopupModal 
                visible={modalState.display} 
                deleteItemId={modalState.deleteItemId} 
                callback={modalCallback}
            />
        </Fragment>
    )
}


const PopupModal = ({ visible, deleteItemId, callback }) => {
    return (visible ? <div onClick={ () => callback(deleteItemId)}>Confirm</div> : null)
}

--- 或 ----

const MainComponent = ({items}) => {
    const [modalState, setModalState] = useState({
        display: false,
        deleteItemId: undefined
    });
    
    return( 
        <Fragment>
            {
                items.map(item => (
                    <Fragment>
                        <li key={item.id}></li>
                        <img onClick={() => setModalState({ display: true, deleteItemId: item.id })} />
                    </Fragment>
                ))
            }
            modalState.display ? <div onClick={() => [deleteList(modalState.deleteItemId), setModalState({display: false, deleteItemId: undefined}) ]}>Confirm</div> : null
        </Fragment>
    )
}

【讨论】:

  • 没有。我通过添加一个带有 "classnames" 的类使弹出窗口可见。那么弹出窗口就可以了。我需要的是仅在按下弹出窗口中的“确认”按钮后才调用 deleteList(item.id)。现在,我不按应有的方式调用此函数,因为项目在弹出窗口出现之前就被删除了。它必须是 1)弹出窗口出现 2)我按“确认” 3)调用函数 deleteItem 4)弹出窗口消失。
  • @brad_fresh 只需将item.id 保存到状态
  • 你帮了大忙!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2018-11-07
相关资源
最近更新 更多