4 回答

TA貢獻(xiàn)1877條經(jīng)驗 獲得超6個贊
如果我錯了請糾正我
您看到這種情況的最可能原因是 JavaScript 內(nèi)部的工作方式。語法:
function xyz() {
}
有一個隱含的this
也許嘗試更改您的代碼:
function onButtonClickHandler(state) {
? console.log(state.person);
};
到:
const onButtonClickHandler = () => {
? console.log(this.state.person);
};

TA貢獻(xiàn)1869條經(jīng)驗 獲得超4個贊
您已將函數(shù)定義onButtonClickHandler為接受一個參數(shù)的函數(shù),并記錄person該參數(shù)的屬性。 函數(shù)中的參數(shù)與組件的參數(shù)state無關(guān)。state 在 JavaScript 中,它們是兩個完全不相關(guān)的變量,只是碰巧具有相同的名稱。
function onButtonClickHandler(state) {
? ?console.log(state.person);
};
當(dāng)button調(diào)用時onClick,它將事件作為參數(shù)傳遞。所以你onButtonClickHandler正在記錄person事件的屬性,這顯然不存在。
由于您沒有使用事件中的任何信息,因此您的函數(shù)不應(yīng)采用任何參數(shù)。正如其他人所說,您還應(yīng)該將此函數(shù)移到方法之外render(),以便不會在每次渲染時重新創(chuàng)建它。bind如果您使用箭頭函數(shù),則不需要使用建議,因為它們會自動綁定。
export default class FetchActors extends React.Component {
? /*...*/
? onButtonClickHandler = () => {
? ? ?console.log(this.state.person);
? };
}
里面render()
<button onClick={this.onButtonClickHandler}>Enter</button>
您還可以將函數(shù)內(nèi)聯(lián)定義為不帶參數(shù)的箭頭函數(shù):
<button onClick={() => console.log(this.state.person)}>Enter</button>
如果您是 React 新手,我建議您學(xué)習(xí)函數(shù)組件而不是類組件。
我試圖在單擊“信息”按鈕時顯示每個字符的數(shù)據(jù)。
一旦我們調(diào)用 API,我們就已經(jīng)加載了每個角色的信息。我們只需要知道要顯示哪一個即可。expanded您可以向您添加一個屬性,并使用它來存儲當(dāng)前擴(kuò)展項目的state索引(或id或,無論您真正想要什么)。name
當(dāng)我們循環(huán)顯示名稱和信息按鈕時,我們檢查該字符是否是展開的字符。如果是這樣,我們將顯示角色信息。
現(xiàn)在onClick按鈕的處理程序負(fù)責(zé)設(shè)置state.expanded我們單擊它的角色。
{this.state.person.map((person, i) =>(
<div>
? <div>
? ? {person.name}
? ? <button onClick={() => this.setState({expanded: i})}>Info</button>
? ? {this.state.expanded === i && (
? ? ? <CharacterInfo
? ? ? ? key={person.name}
? ? ? ? person={person}
? ? ? />
? ? )}
? </div>

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊
有幾種方法可以解決您的問題;我會給你更常見的方法。
您希望將單擊處理程序定義為類(實例)方法,而不是將其聲明為渲染方法內(nèi)的函數(shù)(您可以將其定義為渲染方法內(nèi)的函數(shù),但這可能不是最好的方法超出范圍的各種原因)。
您還必須將其“this”值綁定到類(實例),因為單擊處理程序是異步觸發(fā)的。
最后,添加一個按鈕并在單擊時觸發(fā)獲?。?/p>
class Actors extends React.Component {
state = {
loading: false,
actors: undefined,
};
constructor(props) {
super(props);
this.fetchActors = this.fetchActors.bind(this);
}
async fetchActors() {
this.setState({ loading: true });
const url = "https://swapi.dev/api/people/";
const response = await fetch(url);
const data = await response.json();
this.setState({ actors: data.results, loading: false });
}
render() {
console.log('Actors: ', this.state.actors);
return <button onClick={this.fetchActors}>fetch actors</button>;
}
}

TA貢獻(xiàn)1784條經(jīng)驗 獲得超9個贊
有時我需要反應(yīng)一分鐘來加載更新的狀態(tài)。
import React from "react";
export default class FetchActors extends React.Component {
state = {
loading: true,
person: null
};
async componentDidMount() {
const url = "https://swapi.dev/api/people/";
const response = await fetch(url);
const data = await response.json();
if(!data.results) { // throw error }
this.setState({ person: data.results, loading: false }, () => {
console.log(this.state.person) // log out your data to verify
});
}
render() {
if (this.state.loading || !this.state.person) { // wait for person data
return <div>loading...</div>;
}else{
function onButtonClickHandler(state) { // just make a componentDidUpdate function
console.log(state.person);
};
return (
<div>
<h1>Actors</h1>
{this.state.person.map(person =>(
<div>
<div>
{person.name}
<button onClick={onButtonClickHandler}>Info</button>
</div>
</div>
))}
<button onClick={onButtonClickHandler}>Enter</button>
</div>
);
}
}}
添加回答
舉報