Reactjs函数组件如何在没有点击的情况下触发onClick函数

3

我正在使用React JS中的函数式组件,我的onClick函数在组件渲染时触发而无需单击li元素;这是传递handleCallDetails函数作为props到子组件的父组件:

export default function Cartable(){

    const [items , setItems] = useState(null);
    const [details , setDetails] = useState(null);



    function handleCallDetails(id){
        if(items !== null && details === null){
            let d = items.find(x => {
                return x.id === id;
            });

        }
    }

    useEffect(() => {
        axios.get(`/workflows/${mode}` ,{
            params : {
                OrganizationId : "FE905B40-DA6E-4A81-8A4F-B447AA6B0EA3" , 
                Type : 2 ,
                sortorder : "desc" ,
                pageIndedx : 1 , 
                pageSize : 10
            }
        }).then(response => {
            // console.log('response : ***************** ' , response);
            setItems(response.data.data);
        }).catch(error => {
            console.log('error : ****************** ' , error);
        });
    } , [mode]);

     
   
    return (
        <Grid container spacing={2}>
            <Grid item xs={12} sm={4} md={3}>
                <div className="drt_RightSide drt_segment">
                    <h4 className="drt_RightSideTitle">
                        <i className="far fa-inbox"></i>
                        کارتابل
                    </h4>
                    <ul>
                        {/* <li>
                            <i class="far fa-inbox"></i>
                            <span>درخواست ها</span>
                        </li> */}
                        <li onClick={() => {setMode('pending');}}>
                            <i className="fas fa-exclamation"></i>
                            <span><FormattedMessage id="CARTABLE_PENDING" /></span>
                            <span className="drt_badge_warning drt_NotifNum">5</span>
                        </li>
                        <li onClick={() => {setMode('approved');}}>
                            <i className="far fa-check"></i>
                            <span>تایید شده</span>
                        </li>
                        <li onClick={() => {setMode('rejected');}}>
                            <i className="far fa-times"></i>
                            <span>رد شده</span>
                            <span className="drt_badge_error drt_NotifNum">7</span>
                        </li>
                        <li>
                            <i className="far fa-bell"></i>
                            <span>خارج از فرآیند</span>
                        </li>
                    </ul>
                </div>
            </Grid>
            <Grid item xs={12} sm={8} md={9}>
                <div className="drt_LeftSide drt_segment">                 */}
                        
                    {/* cartbale list */}
                    <CartableList
                        items={items}
                        callDetails={handleCallDetails}/>

                </div>
            </Grid>
        </Grid>
    );

}

这是我的子组件,它使用名为callDetails的onClick函数:

export default function CartableList(props){

    const [showbox , setShowbox] = useState(false);
    const [age, setAge] = useState('');

    const handleChange = (event) => {
        setAge(event.target.value);
    };

    function handleFilterBox(){
        setShowbox(!showbox);
    }


    return (
        <Fragment>
            
            {/* cartable list */}
            <div style={{direction : "ltr"}}>
                <Scrollbars style={{ height: 400 }}>

                    {
                        props.items && props.items !== undefined ?
                            props.items.map(function(item , index){
                                
                                return (
                                    <div className="drt_clearfix drt_CartableItem" key={index} onClick={(props.callDetails)(item.id)}>
                                        {/* <div className={clsx(drt_ItemStar , item.star ? drt_IsStared : '')}>
                                            <span><i className={clsx(item.star ? "fas fa-star" : "fal fa-star")}></i></span>
                                        </div> */}
                                        <div className="drt_ItemImg">
                                            <span>
                                                <img alt={userImg} src={item.pictureUrl !== undefined && item.pictureUrl !== null ? item.image : userImg} />
                                            </span>
                                        </div>
                                        <div className={clsx("drt_ItemName" , !item.isSeen ? "drt_IsNotSeen" : '')}>
                                            {item.issuerFirstName}
                                            <br />
                                            {item.issuerLastname}
                                        </div>
                                        <div className="drt_ItemIcon">
                                            <Tooltip title={(props.moduleType)(item.type).name}>
                                                <span className={item.isSeen ? "drt_badge_default" : "drt_badge_primary"}>
                                                    <i className={(props.moduleType)(item.type).icon} />
                                                </span>
                                            </Tooltip>
                                        </div>
                                        <div className={clsx("drt_ItemDesc" , !item.isSeen ? "drt_IsNotSeen" : '')}>
                                            {item.objectTitle}
                                        </div>
                                        <div className="drt_ItemStatus">
                                            <span className={(props.stateClass)(item.status)}>
                                                {(props.stateTitle)(item.status)}
                                            </span>
                                        </div>
                                        <div className={clsx("drt_ItemDate" , !item.isSeen ? "drt_IsNotSeen" : '')}>
                                            <p>
                                                <span>
                                                    {item.issuerTime}
                                                </span>
                                                <span>
                                                    {item.issuerDate}
                                                </span>
                                            </p>
                                            <i className="fal fa-clock" />
                                        </div>
                                    </div>
                                );
                            }) : ''
                    }
                    
                </Scrollbars>
            </div>
        </Fragment>
    );

}

请帮我解决这个问题,但不要将我的函数组件转换为类组件并绑定我的函数。
4个回答

8
正确的方法是使用箭头函数,否则React会理解为你想在加载时执行该函数。 错误的做法
<div className="drt_clearfix drt_CartableItem" key={index} onClick={(props.callDetails)(item.id)}>

正确的

<div className="drt_clearfix drt_CartableItem" key={index} onClick={() => props.callDetails(item.id)}>

这是一个有趣的事实。 - undefined

2

从以下内容变更

onClick={() => {setMode('rejected');}}

to

onClick={() => setMode('rejected')}

此外
<div className="drt_clearfix drt_CartableItem" key={index} onClick={() => props.callDetails(item.id)}>

但是你在哪里定义了const [mode, setMode]状态?


1
FYI,虽然 onClick={() => {setMode('rejected');}} 可以在编码风格上进行改进,但它并没有技术上的错误,也不会引起问题。 - undefined
是的,我也这么认为。只是遵循惯例而已。 - undefined

1
这主要是因为你的子组件中有一段代码 onClick={(props.callDetails)(item.id)}。实际上,这段代码会立即执行 callDetails 函数并传递 item.id 值。一种处理方法是将函数进行包装。

onClick={() => {props.callDetails(item.id)}}

包装后,onClick 没有直接传入任何值,所以它不会被调用。


1
根据你的代码,似乎你立即执行了回调函数,因为它是在渲染时执行的:
onClick={(props.callDetails)(item.id)}

它应该是:

onClick={() => props.callDetails(item.id)}

那就是问题所在了吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接