sth*_*hig 7 javascript ecmascript-6 reactjs
我试图按onClick时删除div。div存在于我的父组件中
render() {
const listPlayers = players.map(player => (
<Counter
key={player.id}
player={player}
name={player.name}
sortableGroupDecorator={this.sortableGroupDecorator}
decrementCountTotal={this.decrementCountTotal}
incrementCountTotal={this.incrementCountTotal}
removePlayer={this.removePlayer}
handleClick={player}
/>
));
return (
<ContainLeft style={{ alignItems: 'center' }}>
<ProjectTitle>Score Keeper</ProjectTitle>
<Copy>
A sortable list of players that with adjustable scores. Warning, don't go negative!
</Copy>
<div>
<Stats totalScore={this.state.totalScore} players={players} />
{listPlayers}
</div>
</ContainLeft>
);
}
Run Code Online (Sandbox Code Playgroud)
它将道具传递到子组件,在该子组件上删除div的按钮在这里
return (
<div
style={{ display: this.state.displayInfo }}
className="group-list"
ref={sortableGroupDecorator}
id="cell"
>
<CountCell style={{ background: this.state.color }}>
<Row style={{ alignItems: 'center', marginLeft: '-42px' }}>
<Col>
<DeleteButton onClick={removePlayer}>
<Icon name="delete" className="delete-adjust fa-minus-circle" />
</DeleteButton>
</Col>
Run Code Online (Sandbox Code Playgroud)
(我删除了其余的代码,因为它很长,在这里没有用)
数组(一个单独的文件)被导入到Parent组件中,它的读取如下
const players = [
{
name: 'Jabba',
score: 10,
id: 11
},
{
name: 'Han',
score: 10,
id: 1
},
{
name: 'Rey',
score: 30,
id: 10
}
];
export default players;
Run Code Online (Sandbox Code Playgroud)
所以我想做的是在主要父对象上编写一个函数,当在孩子内部单击它时,div会被删除,删除,消失(最好的词是什么),就像“删除播放器,添加播放器”
在父组件上,我编写了一个函数,当在子组件中单击console.log时,console.log可以工作,但是我在函数中编写的任何内容似乎都不希望起作用。
我正在构建的功能(正在进行中,这里我仍然有些迷茫)是:
removePlayer() {
console.log('this was removed');
players.splice(2, 0, 'Luke', 'Vader');
}
Run Code Online (Sandbox Code Playgroud)
在这里作为道具映射
const listPlayers = players.map(player => (
<Counter
key={player.id}
player={player}
name={player.name}
sortableGroupDecorator={this.sortableGroupDecorator}
decrementCountTotal={this.decrementCountTotal}
incrementCountTotal={this.incrementCountTotal}
removePlayer={this.removePlayer}
handleClick={player}
/>
));
Run Code Online (Sandbox Code Playgroud)
并传递给孩子在这里:
render() {
const {
name,
sortableGroupDecorator,
decrementCountTotal,
incrementCountTotal,
removePlayer
} = this.props;
return (
<div
style={{ display: this.state.displayInfo }}
className="group-list"
ref={sortableGroupDecorator}
id="cell"
>
<CountCell style={{ background: this.state.color }}>
<Row style={{ alignItems: 'center', marginLeft: '-42px' }}>
<Col>
<DeleteButton onClick={removePlayer}>
<Icon name="delete" className="delete-adjust fa-minus-circle" />
</DeleteButton>
Run Code Online (Sandbox Code Playgroud)
我知道所有这些都是冗长的,并且我想提供尽可能多的细节,因为React对我来说仍然是新手,而我对其中的一些困惑感到困惑。感谢您的提前帮助
小智 7
我们在聊天中对其进行了整理。如预期的那样,这是国家的问题。
我制作了一个带有注释的小半伪代码片段作为解释:
import React, { Component } from 'react';
// Your player constant, outside the scope of any React component
// This pretty much just lives in your browser as a plain object.
const players = [
{
name: 'Jabba',
score: 10,
id: 11
},
{
name: 'Han',
score: 10,
id: 1
},
{
name: 'Rey',
score: 30,
id: 10
}
];
class App extends Component {
constructor() {
super();
this.state = {
players, // ES6 Syntax, same as players: players
// Add all your other stuff here
};
}
removePlayer(id) {
const newState = this.state;
const index = newState.players.findIndex(a => a.id === id);
if (index === -1) return;
newState.players.splice(index, 1);
this.setState(newState); // This will update the state and trigger a rerender of the components
}
render() {
const listPlayers = this.state.players.map(player => { // Note the this.state, this is important for React to see changes in the data and thus rerender the Component
<Counter
..
removePlayer={this.removePlayer.bind(this)} //bind this to stay in the context of the parent component
/>
});
return (
<div>
{listPlayers}
</div>
);
}
}
//////////////////////////////////////// Child component
....
<DeleteButton onClick={() => this.props.removePlayer(this.props.player.id)}>
....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19069 次 |
| 最近记录: |