OnClick 未触发路由器中的功能组件
OnClick not firing on functional component in Router
我是 React JS 的新手,我在使用 onClick 事件时遇到了一些问题。
我尝试了很多东西,但作为新手,我肯定遗漏了一些东西。
我正在使用 codesandbox 和 react-router-dom.
这是我的代码,我尝试删除了不需要的部分。
class Game extends React.Component {
state = { selectedCharacters: [], minPlayer: 10, };
selectCharacter = clickedCharacter => {
this.setState(prevState => ({
selectedCharacters: prevState.selectedCharacters.concat(clickedCharacter)
}));
};
render() {
const { selectedCharacters } = this.state;
return (
<div>
<CharactersSelection availableCharacters={this.props.availableCharacters} selectedCharacters={selectedCharacters} selectCharacter={this.selectCharacter}/>
</div>
);
}
}
const CharactersSelection = props => {
return (
<div>
<div className="row">
<div className="row justify-content-center">
{props.availableCharacters.map((char, i) => (
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
onClick={() =>props.selectCharacter(char)}
/>
))}
</div>
</div>
</div>
);
};
const CharacterCardSelection = props => {
return (
<div>
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};
const Content = props => {
return (
<Router>
<div className="content align-items-stretch">
<div className="row">
<div className="menu col-2">
<div>
<Link to="/charactersSelection" class="bm-item"style={menuLinkStyle}>
<i class="fas fa-fw fa-play-circle" />
<span>Nouvelle Partie</span>
</Link>
</div>
</div>
<div className="contentGame col-10">
<div>
<Route path="/charactersSelection" component={() => (<Game {...props} availableCharacters={props.availableCharacters}/>)}/>
</div>
</div>
</div>
</div>
</Router>
);
};
class App extends React.Component {
availableCharacters = [{ imgName: "base_loup.png", name: "Loup Garou", maxInGame: 4 },{ imgName: "base_chasseur.png", name: "Chasseur", maxInGame: 1 }, { imgName: "base_voyante.png", name: "Voyante", maxInGame: 1 }];
render() { return ( <div> <Content availableCharacters=this.availableCharacters} /> </div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
当我点击组件 CharacterCardSelection 时没有任何反应,我哪里错了?
谢谢
这是因为,您没有将 onClick
事件附加到任何节点,您只是将函数传递给子组件,这里:
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
onClick={() => props.selectCharacter(char)} // <====== here
/>
我们在 props 中传递的所有值将只是对象 (props) 条目,我们需要在子组件中使用这些值,然后它才会起作用。
需要在CharacterCardSelection组件中指定某个元素的点击事件,例如:
const CharacterCardSelection = props => {
return (
<div onClick={props.onClick}> // <======= notice onClick in this line
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};
建议:最好使用不同于onClick
的名称将事件处理函数传递给子组件。
const CharactersSelection = props => {
return (
<div>
<div className="row">
<div className="row justify-content-center">
{props.availableCharacters.map((char, i) => (
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
char={char}
selectCharacter={ props.selectCharacter(char)}
/>
))}
</div>
</div>
</div>
);
};
const CharacterCardSelection = props => {
return (
<div onClick={() => props.selectCharacter(props.char)}>
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};
我是 React JS 的新手,我在使用 onClick 事件时遇到了一些问题。 我尝试了很多东西,但作为新手,我肯定遗漏了一些东西。 我正在使用 codesandbox 和 react-router-dom.
这是我的代码,我尝试删除了不需要的部分。
class Game extends React.Component {
state = { selectedCharacters: [], minPlayer: 10, };
selectCharacter = clickedCharacter => {
this.setState(prevState => ({
selectedCharacters: prevState.selectedCharacters.concat(clickedCharacter)
}));
};
render() {
const { selectedCharacters } = this.state;
return (
<div>
<CharactersSelection availableCharacters={this.props.availableCharacters} selectedCharacters={selectedCharacters} selectCharacter={this.selectCharacter}/>
</div>
);
}
}
const CharactersSelection = props => {
return (
<div>
<div className="row">
<div className="row justify-content-center">
{props.availableCharacters.map((char, i) => (
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
onClick={() =>props.selectCharacter(char)}
/>
))}
</div>
</div>
</div>
);
};
const CharacterCardSelection = props => {
return (
<div>
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};
const Content = props => {
return (
<Router>
<div className="content align-items-stretch">
<div className="row">
<div className="menu col-2">
<div>
<Link to="/charactersSelection" class="bm-item"style={menuLinkStyle}>
<i class="fas fa-fw fa-play-circle" />
<span>Nouvelle Partie</span>
</Link>
</div>
</div>
<div className="contentGame col-10">
<div>
<Route path="/charactersSelection" component={() => (<Game {...props} availableCharacters={props.availableCharacters}/>)}/>
</div>
</div>
</div>
</div>
</Router>
);
};
class App extends React.Component {
availableCharacters = [{ imgName: "base_loup.png", name: "Loup Garou", maxInGame: 4 },{ imgName: "base_chasseur.png", name: "Chasseur", maxInGame: 1 }, { imgName: "base_voyante.png", name: "Voyante", maxInGame: 1 }];
render() { return ( <div> <Content availableCharacters=this.availableCharacters} /> </div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
当我点击组件 CharacterCardSelection 时没有任何反应,我哪里错了?
谢谢
这是因为,您没有将 onClick
事件附加到任何节点,您只是将函数传递给子组件,这里:
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
onClick={() => props.selectCharacter(char)} // <====== here
/>
我们在 props 中传递的所有值将只是对象 (props) 条目,我们需要在子组件中使用这些值,然后它才会起作用。
需要在CharacterCardSelection组件中指定某个元素的点击事件,例如:
const CharacterCardSelection = props => {
return (
<div onClick={props.onClick}> // <======= notice onClick in this line
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};
建议:最好使用不同于onClick
的名称将事件处理函数传递给子组件。
const CharactersSelection = props => {
return (
<div>
<div className="row">
<div className="row justify-content-center">
{props.availableCharacters.map((char, i) => (
<CharacterCardSelection
imgName={char.imgName}
name={char.name}
maxInGame={char.maxInGame}
char={char}
selectCharacter={ props.selectCharacter(char)}
/>
))}
</div>
</div>
</div>
);
};
const CharacterCardSelection = props => {
return (
<div onClick={() => props.selectCharacter(props.char)}>
<img className="char-img-sm" src={require("../../public/images/" + props.imgName)}/>
<div className="char-card-selection-txt">
<div className="char-card-selection-name">{props.name}</div>
<div>{props.maxInGame}</div>
</div>
</div>
);
};