React 函数式组件的点击事件(代码中附类组件的点击事件)

在函数组件中根据onClick里调用的函数的写法不同,onClick={}里有多种调用方式。

第一种函数:

    function jump(url,event) {
        goToPage(url);
    }

当onClick={}里调用这个函数时,有两种写法:

(1)方法名.bind(this,参数)

<table onClick={jump.bind(this,goods.link)}>

如果直接用方法名(参数)调用的话,打开页面,该方法自动执行。

<table onClick={jump(goods.link)}>此种方法不用点击,直接执行。

(2)(event)=>方法名(参数,event)

<table onClick={(event)=>jump(goods.link,event)}>

第二种函数:

    const jumpOut = (param)=>{
        return (event)=>{
            goToPage(param);
        };
    };

直接调用

<table onClick={jumpOut(goods.link)}>

当用<table onClick={jumpOut.bind(this,goods.link)}>调用时,点击没有反应。

综合代码:

import React, {Component} from 'react';
import './index.less';

function WaringBanner(props) {
    if (!props.warn) {
        return null;
    }
    return (
        <div className="warning">
            警告!
        </div>
    );
}
function GoodsList(props) {
    const goodsData = props.goodsList;
    // 没有return时,代码只能写在一行
    const listItems = goodsData.map((goods) =>
        <li key={goods.toString()}><img src={goods.imgUrl} style={{width: '100px', height: '100px', margin: '10px'}}></img></li>
    );
    function jump(url,event) {
        goToPage(url);
    }
    //可直接调用
    const jumpOut = (param)=>{
        return (event)=>{
            goToPage(param);
        };
    };
    
    // 有大括号和return的,代码必须写在()中,可多行
    const listItems1 = goodsData.map((goods) => {
        return (<li key={goods.toString()} className="liGoodsStyle">
            {/*第一种函数:jump.bind*/}
            {/*<table onClick={jump.bind(this,goods.link)}>*/}
            {/*第一种函数:event箭头函数*/}
            {/*<table onClick={(event)=>jump(goods.link,event)}>*/}
            {/*第二种函数直接调用*/}
            <table onClick={jumpOut(goods.link)}>
                <tr>
                    <td>
                        <img src={goods.imgUrl} style={{width: '100%', height: '150px'}}></img>
                    </td>
                </tr>
                <tr>
                    <td className="tdHeightStyle">
                        {goods.name}
                    </td>
                </tr>
            </table>

        </li>);
    }
    );

    return (
        <div style={{width: '100%'}} >
            <ul style={{margin: '0px 15px 0px 15px',padding: '0px 10px 0px 10px'}} className="divStyle">{listItems1}</ul>
        </div>
    );
}
export default class Hidden extends Component{
    constructor(props) {
        super(props);
        this.state = {showWarning: false};
        this.handleToggleClick = this.handleToggleClick.bind(this);
    }

    handleToggleClick() {
        this.setState(prevState => ({
            showWarning: !prevState.showWarning
        }));
    }

    render() {
        const {goodsList} = this.props;
        const goodsData = this.props.goodsList;
        // var result = [{imgUrl: 'sdfsd',score: 10},{imgUrl: 'ffff',score: 15}];
        return (
            <div className="hiddenBg">
                <WaringBanner warn={this.state.showWarning}/>
                <button onClick={this.handleToggleClick}>{this.state.showWarning?'隐藏':'显示'}1111</button>
                <button onClick={event => this.handleToggleClick(event)}>{this.state.showWarning?'隐藏':'显示'}1111</button>
                <div className="hiddenBg"><GoodsList goodsList={goodsList}/></div>
            </div>
        );
    }
}

跳转到外链的方法:

    function jump(url,event) {
        //跳转外链并打开新窗口
        // 方法一
        window.open(url);
        // 方法二
        // const w=window.open('about:blank');
        // w.location.href=url;
        // 方法三
        // let win = window.open(url, '_blank');
        // win.focus();
        // 方法四
        // window.location.href = url;
    }

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值