亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

一種從外部調用 React 組件方法的方法(帶有狀態和屬性)

一種從外部調用 React 組件方法的方法(帶有狀態和屬性)

牛魔王的故事 2023-10-14 18:57:30
我一直在調用我的 clickRemoveHandler。我的想法是,我有兩個組件:第一個 - 渲染頁眉、導航和頁腳組件的布局,第二個 - 計算器,它是我的核心組件,具有數據輸入等...在計算器組件中,我有具有托管狀態的按鈕,所以當我單擊時在布局組件(div)的任何地方,我需要調用計算器函數來操作我的按鈕。代碼如下:class Layout extends Component {.....    clickHandler = (event) => {        Calculator.clickRemoveHandler(event);        console.log('Clikced')    };.....}class Calculator extends Component {  state = {    currentServiceClass: null,    hoverIndex: null,    btnClicked: false,    selectedService: null  }  currentCursorPosition = {    el: null,    index: null,    rendered: false  }  static clickRemoveHandler = (event) => {    if ((!event.target.hasAttribute("type")) && (this.state.btnClicked)) {      this.currentCursorPosition = {        el: null,        index: null,        rendered: false      };      this.setState({currentServiceClass: null, hoverIndex: null, btnClicked: false})    }  }....}這些組件中有很多邏輯,因此它們太強大,無法發布完整的代碼。但問題是布局中沒有計算器引用,計算器本身是通過另一個組件的路由渲染的,所以我無法將任何數據從布局直接傳遞到計算器。我想要的是從布局中調用靜態 clickRemoveHandler 。我猜靜態是使函數全局化的一個選項。所以它有效,但我收到錯誤 TypeError: undefined is not an object (evaluating 'Calculator.state.btnClicked')。正如我所見,這意味著當調用 clickRemoveHandler 時,它不與計算器組件關聯,或者無法訪問其狀態和屬性。問題是我怎樣才能讓這一切一起工作?調用函數時傳遞計算器狀態還是有另一種更優雅的方法來做到這一點?
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

我建議對于您描述的情況(不同級別的不同組件需要訪問某些狀態并對其進行操作)使用 React context。您還可以查看狀態管理器,例如ReduxMobX,但在這種特殊情況下,這將是開銷,因為您的應用程序不是那么“巨大”?;旧希枰獎摻ㄒ恍﹩为毜奈募A(您可以將其稱為context),在其中您應該創建上下文本身,將其導出并將其包裝在最上層的組件中,以便所有子級都能夠使用它。

您可以在這里找到一個示例:https ://codesandbox.io/s/spring-glitter-0vzul 。

這是文檔的鏈接: https: //reactjs.org/docs/context.html

如果您需要,我可以為您提供更多詳細信息


查看完整回答
反對 回復 2023-10-14
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

這是一個挑戰,但我已經做到了!布局組件:


state = {

    firstMount: false,

    clicked: false,

    clickedEvt: null

};

clickHandler = (event) => {

    console.log('Clikced')

    if (this.state.clickedEvt) 

        this.setState({clicked: false, clickedEvt: null});

    else         

        this.setState({clicked: true, clickedEvt: event.target}, ()=>{setTimeout(() => 

            this.setState({clicked: false, clickedEvt: null})

        , 50)})


};

        <LayoutContext.Provider value={{

            clicked: this.state.clicked,

            clickedEvt: this.state.clickedEvt,

            handleClick: this.clickHandler

        }}>


render() {

    return(

        <div onClick={(event) => this.clickHandler(event)} className="web">

首先,我從布局組件調用handleClick作為onclick事件,然后從計算器再次調用它


  componentDidUpdate() {

    if (this.context.clicked) {

      this.clickRemoveHandler(this.context.clickedEvt)

    }

  }


查看完整回答
反對 回復 2023-10-14
  • 2 回答
  • 0 關注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號