簡體   English   中英

通過具有功能組件的道具,而無需在組件內聲明功能

[英]pass props with functional component without declaring function within component

我遍歷項目列表,並想調用onClick()函數。 下面的例子:

class App extends Component {
    state = { items: [1, 2, 3, 4] };

    click = i => console.log(i);

    render() {
        return (
            <div>
                {this.state.items.map(item => (
                    <div 
                        key={item} 
                        // this works fine, but I rather not declare functions within the render function / JSX
                        onClick={() => this.click(item)}
                    >
                        {`click on # ${item}`}
                    </div>
                ))}
            </div>
        )
    }
}

如您所見,我在JSX中聲明了一個函數。 我一遍又一遍地執行此操作,但是不久前,我了解到出於性能原因,您應該避免在組件JSX本身中聲明一個函數。

功能部件也是如此嗎? 如果是這樣,還有其他方法可以將動態信息(在本例中為項目)傳遞給回調嗎?

注意:我期待在某個時候使用鈎子,但是現在我只想知道一種最佳實踐而不使用它們。

注意二:話雖如此,如果您確定這是一個相關問題,並且由於鈎子而無法解決,那我顯然想了解一下:)

功能部件也是如此嗎?

好吧,實際上您的代碼中沒有使用任何功能組件。 無論是函數,變量聲明還是調用,在經常調用的函數render()例如render()所做的所有操作都會導致性能下降。 減少問題是另一回事。

如果是這樣,還有其他方法可以將動態信息(在本例中為項目)傳遞給回調嗎?

你可以.bind(...)它:

 onClick = {console.log.bind(console, item) }

但實際上,您是否注意到重新提交有任何延遲? 可能不是,如果不是,那不是由函數聲明引起的。 寫出看起來很美的代碼,不要為編譯器進行優化,而讓編譯器來做。

但是前段時間我了解到您應該避免在組件JSX本身中聲明一個函數

您不應該真正避免使用它,而是盡可能使用其他方法。 在這種情況下,並沒有更好的方法。

您可以聲明另一個這樣的方法。 不要忘記使用.bind 否則,該方法將無法正確調用。

class App extends Component {
    state = { items: [1, 2, 3, 4] };

    handleClick(item) {
        // do something
        console.log(item);
    }
    render() {
        return (
            <div>
                {this.state.items.map(item => (
                    <div 
                        key={item} 
                        // this works fine, but I rather not declare functions within the render function / JSX
                        onClick={this.handleClick.bind(this, item)}
                    >
                        {`click on # ${item}`}
                    </div>
                ))}
            </div>
        )
    }
}

您可以創建一個父組件,該父組件將負責遍歷所有項目,並將點擊處理程序作為道具傳遞給每個子組件。

然后,在子組件內部,您可以輕松地將處理程序引用為this.props.onClick

函數(對象)在JavaScript中通過引用傳遞。 通過在父作用域中聲明它,只會在那兒占用空間。 如果在子級中初始化,它將為每個子級組件的函數在內存中創建空間。

class Parent extends Component {
    state = { items: [1, 2, 3, 4] };

    parentClick(item) {
        // do something
        console.log(item);
    }
    render() {
        return (
            <div>
                {this.state.items.map(item => (
                  <Child item={item} onClick={this.parentClick}>
                ))}
            </div>
        )
    }
}



class Child extends Component {

    childClick(item) {
        this.props.onClick(item)
    }

    render() {
        return (
            <div>
                <p onClick={this.childClick(this.props.item)}>this.props.item</p>
            </div>
        )
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM