解讀react的onClick自動(dòng)觸發(fā)等相關(guān)問(wèn)題
react的onClick自動(dòng)觸發(fā)等問(wèn)題
react分頁(yè)組件遇到的問(wèn)題:
? private getFirst() {
? ? const { pageNo } = this.state;
? ? if (pageNo > 3) {
? ? ? return (<span onClick={this.changePage(1)}>首頁(yè)</span>);
? ? } else {
? ? ? return;
? ? }
? }
? private changePage (index: number) {
? ? this.setState({ pageNo: index });
? }這段代碼的onClick直接報(bào)錯(cuò):不能將類型“void”分配給類型“((event: MouseEvent<HTMLSpanElement>) => void) | undefined”,這個(gè)報(bào)錯(cuò)看得我莫名其妙……
同事告訴我要給changePage函數(shù)加個(gè)return ()=>{}形成閉包。其實(shí)后來(lái)我才發(fā)現(xiàn),雖然changePage寫(xiě)得很像function,但其只是一個(gè)變量而已,所以并不滿足onClick的內(nèi)容是方法的情況。
? private getFirst() {
? ? const { pageNo } = this.state;
? ? if (pageNo > 3) {
? ? ? return (<span onClick={this.changePage(1)}>首頁(yè)</span>);
? ? } else {
? ? ? return;
? ? }
? }
?
? private changePage (index: number) {
? ? return () => {this.setState({ pageNo: index });}
? }這樣寫(xiě)雖然不報(bào)錯(cuò),但有個(gè)嚴(yán)重的問(wèn)題,每次生成UI時(shí)它都會(huì)自動(dòng)觸發(fā)onClick,這個(gè)機(jī)制真是???……所以最后改成了:
? private getFirst() {
? ? const { pageNo } = this.state;
? ? if (pageNo > 3) {
? ? ? return (<span onClick={()=>this.changePage(1)}>首頁(yè)</span>);
? ? } else {
? ? ? return;
? ? }
? }
? private changePage (index: number) {
? ? this.setState({ pageNo: index });
? }再補(bǔ)充一個(gè)使用的例子:
import React from 'react';
?
interface Iprops {
? name: string;
? click: any;
}
?
const ButtonItem = (props: Iprops) => {
? return <div onClick={props.click}>{props.name}</div>
}
?
const ContentMenu: React.FC<{}> = () => {
? const product = (type: number) => {
? ? return () => {
? ? ? alert(type);
? ? }
? }
?
? return (
? ? <div>
? ? ? <ButtonItem name="生成1" click={product(1)} />
? ? </div>
? );
};
?
export default ContentMenu;react的onClick事件調(diào)用的各種寫(xiě)法與觸發(fā)情況
handleClick 是普通函數(shù)
handleClick(params?: any) {
console.log('1000101010101010100');
console.log(params);
console.log(this)
}
onClick={this.handleClick}
// 正確,但是無(wú)法傳值
onClick={this.handleClick()}
// 在handleClick(): any,即聲明返回值any 時(shí),不需要 this.handleClick = this.handleClick.bind(this),似乎能正確使用,能獲取到 this;
// 在handleClick() 不設(shè)置 : any 時(shí),不管是否增加 this.handleClick = this.handleClick.bind(this),都是報(bào)錯(cuò),界面無(wú)法顯示。
onClick={this.handleClick.bind(this, 12)}
// 正確,不需要 this.handleClick = this.handleClick.bind(this),能獲取this,能獲取參數(shù)。
onClick={() => this.handleClick}
// 無(wú)效且無(wú)報(bào)錯(cuò),即無(wú)法觸發(fā)
onClick={() => { this.handleClick }}
// 無(wú)效且無(wú)報(bào)錯(cuò),即無(wú)法觸發(fā)
onClick={() => this.handleClick()}
// 正確,不需要 this.handleClick = this.handleClick.bind(this),能獲取this,能獲取參數(shù)。
onClick={() => { this.handleClick() }}
// 正確,能獲取this,能獲取參數(shù)。
handleClick 是箭頭函數(shù)
PS:箭頭函數(shù)皆不需要 this.handleClick = this.handleClick.bind(this):
handleClick = (params?: any) => {
console.log('1000101010101010100');
console.log(params);
console.log(this)
}
onClick={this.handleClick}
// 正確,但是無(wú)法傳值
onClick={this.handleClick()}
// 在handleClick(): any,即聲明返回值any 時(shí),頁(yè)面渲染時(shí),自動(dòng)觸發(fā)onClick,且onClick點(diǎn)擊失效;
// 在handleClick() 不設(shè)置 : any 時(shí),報(bào)錯(cuò),界面無(wú)法顯示。
onClick={() => this.handleClick}
// 無(wú)效且無(wú)報(bào)錯(cuò),即無(wú)法觸發(fā)
onClick={() => { this.handleClick }}
// 無(wú)效且無(wú)報(bào)錯(cuò),即無(wú)法觸發(fā)
onClick={() => this.handleClick()}
// 正確,能獲取this,能獲取參數(shù)。
onClick={() => { this.handleClick() }}
// 正確,能獲取this,能獲取參數(shù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
瀏覽器中視頻播放器實(shí)現(xiàn)的基本思路與代碼
這篇文章主要給大家介紹了關(guān)于瀏覽器中視頻播放器實(shí)現(xiàn)的基本思路與代碼,并且詳細(xì)總結(jié)了瀏覽器中的音視頻知識(shí),對(duì)大家的理解和學(xué)習(xí)非常有幫助,需要的朋友可以參考下2021-08-08
concent漸進(jìn)式重構(gòu)react應(yīng)用使用詳解
這篇文章主要為大家介紹了concent漸進(jìn)式重構(gòu)react應(yīng)用的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
如何應(yīng)用?SOLID?原則在?React?中整理代碼之開(kāi)閉原則
React?不是面向?qū)ο?,但這些原則背后的主要思想可能是有幫助的,在本文中,我將嘗試演示如何應(yīng)用這些原則來(lái)編寫(xiě)更好的代碼,對(duì)React?SOLID原則開(kāi)閉原則相關(guān)知識(shí)感興趣的朋友一起看看吧2022-07-07
react使用節(jié)流函數(shù)防止重復(fù)點(diǎn)擊問(wèn)題
這篇文章主要介紹了react使用節(jié)流函數(shù)防止重復(fù)點(diǎn)擊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
react antd表格中渲染一張或多張圖片的實(shí)例
這篇文章主要介紹了react antd表格中渲染一張或多張圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法
本篇文章主要介紹了react router4+redux實(shí)現(xiàn)路由權(quán)限控制的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
react component changing uncontrolled in
這篇文章主要為大家介紹了react component changing uncontrolled input報(bào)錯(cuò)解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

