Javascript 反应-如果球员的得分发生变化,则在记分板上按最高得分对其进行排序
我已经建立了一个反应应用程序,这是一个记分牌。您可以使用右侧的+和-符号添加和删除玩家分数中的分数。目前,球员是按id排序的。我想找出一种根据球员当前得分对球员进行排序的方法 例如,如果一名玩家的得分高于他们之上的另一名玩家,则该玩家将向上移动到他们排名的那一行。我制作了一个代码笔来显示我的项目。如果有人知道在运行Javascript 反应-如果球员的得分发生变化,则在记分板上按最高得分对其进行排序,javascript,reactjs,sorting,components,Javascript,Reactjs,Sorting,Components,我已经建立了一个反应应用程序,这是一个记分牌。您可以使用右侧的+和-符号添加和删除玩家分数中的分数。目前,球员是按id排序的。我想找出一种根据球员当前得分对球员进行排序的方法 例如,如果一名玩家的得分高于他们之上的另一名玩家,则该玩家将向上移动到他们排名的那一行。我制作了一个代码笔来显示我的项目。如果有人知道在运行onScoreChange功能后如何对玩家进行排序,我将不胜感激 身体{ 背景#d5d5d5; 字体系列:arial; 颜色:#FAFAFA; 文本转换:大写; } .记分牌{ 背
onScoreChange
功能后如何对玩家进行排序,我将不胜感激
身体{
背景#d5d5d5;
字体系列:arial;
颜色:#FAFAFA;
文本转换:大写;
}
.记分牌{
背景:#333;
宽度:700px;
利润率:70像素自动;
盒影:0 4px 0px#333;
边界半径:15px;
}
.标题{
填充物:5px10px;
文本对齐:居中;
显示器:flex;
对齐项目:居中;
背景色:#222;
边界半径:15px 15px 0;
边框底部:实心2px#444;
}
.标题h1{
柔性生长:1;
字号:1.5em;
字母间距:3px;
字体大小:正常;
}
.玩家{
显示器:flex;
字体大小:1.2米;
边框底部:实心2px#444;
字母间距:2px;
}
.移除播放器{
可见性:隐藏;
右边距:10px;
颜色:#e57373;
光标:指针;
}
.玩家名称:悬停。移除玩家{
能见度:可见;
}
.玩家名称{
柔性生长:1;
填充:20px 10px 10px 10px;
}
.球员得分{
宽度:190px;
背景:蓝色;
}
.柜台{
显示器:flex;
}
.反作用{
边界:无;
字体大小:粗体;
颜色:#FAFAFA;
显示:块;
填充:20px 20px;
光标:指针;
-webkit用户选择:无;
-moz用户选择:无;
-ms用户选择:无;
用户选择:无;
}
.反作用{
背景#66BB6A;
}
.反作用.增量:悬停{
背景#549d59;
光标:指针;
}
.反作用{
背景:ef5350;
}
.反作用.减量:悬停{
背景:#c44442;
光标:指针;
}
.记分{
柔性生长:1;
背景#2b2b;
颜色:#FAFAFA;
文本对齐:居中;
字体系列:monospace;
填充:10px;
字号:2em;
}
.添加玩家表单{
显示器:flex;
背景色:#222;
边界半径:0 0 20px 20px
}
.添加播放器窗体输入[类型=文本]{
柔性生长:1;
边框宽度:0 1px 0;
利润率:15px 10px 15px 15px;
填充:10px;
边界半径:5px;
背景色:#333;
边框样式:无;
文本阴影:无;
文本转换:大写;
颜色:#999;
字母间距:2px;
大纲:无;
}
.add播放器表单输入[type=text]:-webkit输入占位符{
颜色:#666;
字母间距:2px;
}
.添加播放器窗体输入[类型=文本]:焦点{
背景色:#444;
}
.添加玩家表单输入[类型=提交]{
显示:块;
字体大小:.6em;
利润率:15px 15px 15px 0;
填充:10px;
背景色:#333;
边界半径:5px;
边界:无;
颜色:#999;
字母间距:2px;
字体大小:粗体;
文本阴影:无;
文本转换:大写;
}
.添加玩家表单输入[type=submit]:悬停{
背景:#4b71b5;
颜色:#fafafa;
光标:指针;
}
var玩家=[
{
姓名:“玛丽·米勒”,
得分:22分,
id:1,
},
{
姓名:“Ellie Grace”,
分数:20,,
id:2,
},
{
姓名:“本·派恩”,
得分:18分,
id:3,
},
{
姓名:“雷切尔·斯莱特”,
得分:17分,
id:4,
},
{
姓名:“Lisette Ven”,
得分:10分,
id:5,
},
];
var-nextId=6;
var addPlayPerform=React.createClass({
道具类型:{
onAdd:React.PropTypes.func.isRequired,
},
getInitialState:函数(){
返回{
姓名:“,
};
},
onNameChange:函数(e){
this.setState({name:e.target.value});
},
提交人:函数(e){
e、 预防默认值();
this.props.onAdd(this.state.name);
this.setState({name:});
},
render:function(){
返回(
);
}
});
功能标题(道具){
返回(
{props.title}
);
}
Header.propTypes={
标题:React.PropTypes.string.isRequired,
玩家:React.PropTypes.array.isRequired,
};
功能计数器(道具){
返回(
-
{props.score}
+
);
}
Counter.propTypes={
分数:React.PropTypes.number.isRequired,
onChange:React.PropTypes.func.isRequired,
}
功能播放器(道具){
返回(
✖
{props.name}
);
}
Player.propTypes={
名称:React.PropTypes.string.isRequired,
分数:React.PropTypes.number.isRequired,
OnCoreChange:React.PropTypes.func.isRequired,
onRemove:React.PropTypes.func.isRequired,
};
var Application=React.createClass({
道具类型:{
标题:React.PropTypes.string,
初始玩家:React.PropTypes.arrayOf(React.PropTypes.shape({
名称:React.PropTypes.string.isRequired,
分数:React.PropTypes.number.isRequired,
id:React.PropTypes.number.isRequired,
})).要求,
},
getDefaultProps:function(){
返回{
标题:“足球记分牌”,
}
},
getInitialState:函数(){
返回{
玩家:这个。道具。初始玩家,
};
},
OnCoreChange:函数(索引,增量){
this.state.players[index].score+=delta;
this.setState(this.state);
},
onplayerad:函数(名称){
这个,州,球员,推({
姓名:姓名,,
分数:0,
id:nextId,
});
this.setState(this.state);
nextId+=1;
},
onRemovePlayer:函数(索引){
this.state.players.splice(索引1);
this.setState(this.state);
},
//重排球员
render:function(){
返回(
<div id="container"></div>
body {
background: #d5d5d5;
font-family: arial;
color: #FAFAFA;
text-transform: uppercase;
}
.scoreboard {
background: #333;
width: 700px;
margin: 70px auto;
box-shadow: 0 4px 0px #333;
border-radius: 15px;
}
.header {
padding: 5px 10px;
text-align: center;
display: flex;
align-items: center;
background-color: #222;
border-radius: 15px 15px 0 0;
border-bottom: solid 2px #444;
}
.header h1 {
flex-grow: 1;
font-size: 1.5em;
letter-spacing: 3px;
font-weight: normal;
}
.player {
display: flex;
font-size: 1.2em;
border-bottom: solid 2px #444;
letter-spacing: 2px;
}
.remove-player {
visibility: hidden;
margin-right: 10px;
color: #e57373;
cursor: pointer;
}
.player-name:hover .remove-player {
visibility: visible;
}
.player-name {
flex-grow: 1;
padding: 20px 10px 10px 10px;
}
.player-score {
width: 190px;
background: blue;
}
.counter {
display: flex;
}
.counter-action {
border: none;
font-weight: bold;
color: #FAFAFA;
display: block;
padding: 20px 20px;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.counter-action.increment {
background: #66BB6A;
}
.counter-action.increment:hover {
background: #549d59;
cursor: pointer;
}
.counter-action.decrement {
background: #ef5350;
}
.counter-action.decrement:hover {
background: #c44442;
cursor: pointer;
}
.counter-score {
flex-grow: 1;
background: #2b2b2b;
color: #FAFAFA;
text-align: center;
font-family: monospace;
padding: 10px;
font-size: 2em;
}
.add-player-form form {
display: flex;
background-color: #222;
border-radius: 0 0 20px 20px
}
.add-player-form input[type=text] {
flex-grow: 1;
border-width: 0 0 1px 0;
margin: 15px 10px 15px 15px;
padding: 10px;
border-radius: 5px;
background-color: #333;
border-style: none;
text-shadow: none;
text-transform: uppercase;
color: #999;
letter-spacing: 2px;
outline: none;
}
.add-player-form input[type=text]::-webkit-input-placeholder{
color: #666;
letter-spacing: 2px;
}
.add-player-form input[type=text]:focus{
background-color: #444;
}
.add-player-form input[type=submit] {
display: block;
font-size: .6em;
margin: 15px 15px 15px 0;
padding: 10px;
background-color: #333;
border-radius: 5px;
border: none;
color: #999;
letter-spacing: 2px;
font-weight: bold;
text-shadow: none;
text-transform: uppercase;
}
.add-player-form input[type=submit]:hover{
background: #4b71b5;
color: #fafafa;
cursor: pointer;
}
var PLAYERS = [
{
name: "Mary Miller",
score: 22,
id: 1,
},
{
name: "Ellie Grace",
score: 20,
id: 2,
},
{
name: "Ben Pine",
score: 18,
id: 3,
},
{
name: "Rachel Slater",
score: 17,
id: 4,
},
{
name: "Lisette Ven",
score: 10,
id: 5,
},
];
var nextId = 6;
var AddPlayerForm = React.createClass({
propTypes: {
onAdd: React.PropTypes.func.isRequired,
},
getInitialState: function() {
return {
name: "",
};
},
onNameChange: function(e) {
this.setState({name: e.target.value});
},
onSubmit: function(e) {
e.preventDefault();
this.props.onAdd(this.state.name);
this.setState({name: ""});
},
render: function() {
return (
<div className="add-player-form">
<form onSubmit={this.onSubmit}>
<input type="text" value={this.state.name} onChange={this.onNameChange} />
<input type="submit" value="Add Player" />
</form>
</div>
);
}
});
function Header(props) {
return (
<div className="header">
<h1>{props.title}</h1>
</div>
);
}
Header.propTypes = {
title: React.PropTypes.string.isRequired,
players: React.PropTypes.array.isRequired,
};
function Counter(props) {
return (
<div className="counter">
<button className="counter-action decrement" onClick={function() {props.onChange(-1);}} > - </button>
<div className="counter-score"> {props.score} </div>
<button className="counter-action increment" onClick={function() {props.onChange(1);}}> + </button>
</div>
);
}
Counter.propTypes = {
score: React.PropTypes.number.isRequired,
onChange: React.PropTypes.func.isRequired,
}
function Player(props) {
return (
<div className="player">
<div className="player-name">
<a className="remove-player" onClick={props.onRemove}>✖</a>
{props.name}
</div>
<div className="player-score">
<Counter score={props.score} onChange={props.onScoreChange} />
</div>
</div>
);
}
Player.propTypes = {
name: React.PropTypes.string.isRequired,
score: React.PropTypes.number.isRequired,
onScoreChange: React.PropTypes.func.isRequired,
onRemove: React.PropTypes.func.isRequired,
};
var Application = React.createClass({
propTypes: {
title: React.PropTypes.string,
initialPlayers: React.PropTypes.arrayOf(React.PropTypes.shape({
name: React.PropTypes.string.isRequired,
score: React.PropTypes.number.isRequired,
id: React.PropTypes.number.isRequired,
})).isRequired,
},
getDefaultProps: function() {
return {
title: "Foosball Scoreboard",
}
},
getInitialState: function() {
return {
players: this.props.initialPlayers,
};
},
onScoreChange: function(index, delta) {
this.state.players[index].score += delta;
this.setState(this.state);
},
onPlayerAdd: function(name) {
this.state.players.push({
name: name,
score: 0,
id: nextId,
});
this.setState(this.state);
nextId += 1;
},
onRemovePlayer: function(index) {
this.state.players.splice(index, 1);
this.setState(this.state);
},
// reorderPlayers
render: function() {
return (
<div className="scoreboard">
<Header title={this.props.title} players={this.state.players} />
<div className="players">
{this.state.players.map(function(player, index) {
return (
<Player
onScoreChange={function(delta) {this.onScoreChange(index ,delta)}.bind(this)}
onRemove={function() {this.onRemovePlayer(index)}.bind(this)}
name={player.name}
score={player.score}
key={player.id} />
);
}.bind(this))}
</div>
<AddPlayerForm onAdd={this.onPlayerAdd} />
</div>
);
}
});
ReactDOM.render(<Application initialPlayers={PLAYERS}/>, document.getElementById('container'));
onScoreChange: function(index, delta) {
let players = [...this.state.players]
players[index] = Object.assign({},players[index])
// Or if you can use object spread then: players[index] = {...players[index]}
players[index].score += delta;
// Use Array.sort function like this
players.sort((a,b) => b.score - a.score)
this.setState({players});
},