【问题标题】:How to randomly select and split into two teams in react hooks如何在 React Hooks 中随机选择并分成两个团队
【发布时间】:2020-10-15 08:14:37
【问题描述】:

我想从array中随机选择球员并分成两队。如果将偶数玩家平均分成两支球队,但如果球员人数是奇数(不是偶数),则可以在任何球队中多出一名球员。

我创建了一个 javascript 来分成团队,但我不知道如何将 test1test2 数组而不是 allUsers 推送到两个团队。

我提供了一个演示链接: https://codesandbox.io/s/amazing-ellis-2h3pd?file=/src/components/Team.js

import React, { useRef, useEffect, useState } from "react";
import axios from 'axios'
import DailyStatusDialog from "../modal/DailyStatus";
import * as moment from 'moment';
    const allPlayers = [
  {
    id: "1",
    name: "Player 1",
    image: "images/photo-2345678.JPG"
  },
  {
    id: "2",
    name: "Player 2",
    image: "images/photo-2345679.JPG"
  },
  {
    id: "3",
    name: "Player 3",
    image: "images/photo-2345680.JPG"
  },
  {
    id: "4",
    name: "Player 4",
    image: "images/photo-2345681.JPG"
  },
  {
    id: "5",
    name: "Player 5",
    image: "images/photo-2345682.JPG"
  }
];

const Availability = () =>{
    const [team1, setTeam1] = useState([]);
    const [team2, setTeam2] = useState([]);
    const [deleteDialog, setDeleteDialog] = useState(false);
    const [playerId, setPlayerId] = useState("");
    const [helperText, setHelperText] = useState('');
    const loginUserEmail = localStorage.getItem('loginEmail');
    const [dailyStatusPlayers, setDailyStatusPlayers] = useState([]);
    //const [dailyinput, setDailyInput] = useState('');
    const [inCount, setInCount] = useState("");
    const isMounted = useRef(false);
    const c_day = moment().format('dddd');
    const c_date = moment().format('DD-MM-YYYY');

    let i = 0;
    const tempTeam1 = [];
    const tempTeam2 = [];
    while(allPlayers.length > 0) {
      const random = Math.floor(Math.random() * allPlayers.length);
      i%2 === 0 ? tempTeam1.push(allPlayers[random]) : tempTeam2.push(allPlayers[random]);
      allPlayers.splice(random, 1);
      i++;
    }
    setTeam1(tempTeam1);
    setTeam2(tempTeam2);
    
    useEffect(() => {
        isMounted.current = true;
        return () => isMounted.current = false;
      }, []);


    const displayAvailabilityStatus = () =>{
       setDeleteDialog(true);
    }
     
    useEffect(() => {
        const fetchData = async () => {
          try {
            const res = await axios.get('http://localhost:8000/service/availability');
            if (isMounted.current) {
               setDailyStatusPlayers(res.data.dailyStatus);
            }
          } catch (e) {
            console.log(e);
          }
        }
        fetchData();
      }, []);
    

    const onSubmit = (dailyinput) =>{
        console.log("Here Daily:"+ dailyinput);
        const dailyStatus = async () => {
            try {
                const params = {
                    email: loginUserEmail,
                };
              const res = await axios.post('http://localhost:8000/service/availability', { dailystatus: dailyinput }, {params} );
              console.log("Dailystatus update" + res.data.success);
              if (res.data.success) {
                setDeleteDialog(false);
              }
              else {
                console.log(res.data.message);
                setHelperText(res.data.message);
              }
            } catch (e) {
              setHelperText(e.response.data.message);
            }
          }
          dailyStatus();
    }

    return (
        <div className="availability_wrapper">
          <div className="displayCurrentDate">
          <b>{c_day}</b>, {c_date}
          </div>
         <h4>In: <span className="displayInCount">20</span></h4>
            <div className="wrap">
                <div className="container">
                    <div className="dailystatus_section">
                        <span className="playerdailyrecord">
                            <div className="row">
                                {
                                dailyStatusPlayers.map(({id, dailystatus}) =>(
                                <div key={id}  className="playerdailyrecord_main">
                                    <span className="dailstatus_playerphoto"><img className="dailstatus_playerImage"src="images/photo-1592866808392.JPG"></img></span>
                                <span className="dailstatus">{dailystatus}</span>
                                    <span className="dailstatus_playerposition">Forward</span>
                                </div>
                                ))        
                                }
                            </div>
                            <span className="">
                                <button className="OverlayDailyStatus" onClick={displayAvailabilityStatus}>Enter</button>
                            </span>
                        </span>
                    </div>
                </div>
                <div>
                    <div className="container">
                        <div className="playerdistribution_section">
                            <h4>Team Selection</h4>
                        </div>
                    </div>
                    <div className="container">
                        <div className="weeklycount_graph_section">
                                <h4>Weekly Player Availability</h4>
                        </div>
                    </div>
                </div>
            </div>
            <DailyStatusDialog
              onSubmit={onSubmit}
              open={deleteDialog}
              onClose={() => setDeleteDialog(false)}
            />
        </div>
    );

}
export default Availability;

【问题讨论】:

  • 你尝试过什么,它到底有什么问题?这与通常尝试从数组中挑选有什么不同,钩子,表达,axios,反应如何参与?这似乎是纯粹的javascript
  • 你能在你的问题中发布相关代码,这样就没有人需要在你的链接沙箱中寻找它了吗?沙盒会随着时间的推移而改变或被移除,因此最好还是在此处包含代码。还请包括调试和有关未按预期工作的具体细节。
  • @DrewReese 我已经添加了 javascript 代码以拆分为团队,但不确定如何推送到`test1、test2` 数组而不是 allusers.map 并将数据推送到两个 div 中

标签: reactjs express axios react-hooks


【解决方案1】:

你可以从数组中随机取出一个元素并移除它,重复这个过程直到数组为空

const items = [1,2,3,4,5]
const [team1, setTeam1] = useState([]);
const [team2, setTeam2] = useState([]);

let i = 0;
const tempTeam1 = [];
const tempTeam2 = [];
while(items.length > 0) {
  const random = Math.floor(Math.random() * items.length);
  i%2 === 0 ? tempTeam1.push(items[random]) : tempTeam2.push(items[random]);
  items.splice(random, 1);
  i++;
}
setTeam1(tempTeam1);
setTeam2(tempTeam2);

<div key={name} className="left_col">
  {team1.map(name=><span>{name}</span>)}
</div>
    
<div key={name} className="right_col">
  {team2.map(name=><span>{name}</span>)}
</div>

【讨论】:

  • 谢谢你的朋友,非常感谢,我已经用我尝试过的方法更新了我的问题,请你看看。我如何将 test1 、 test2 数组推送到那些 div left_colright_col
  • 你需要使用状态变量
  • 我会尝试并回复,对于像我这样的 reactjs 新手来说非常棒的帮助
  • 我收到两个错误,例如 组件中发生错误:在 ProtectedRoute 中的可用性(在 protected.route.js:10)中(在 protected.route.js:6)中(在 App.js:38) 在 Switch (在 App.js:34) 在 UserProfileProvider (在 App.js:31) 在 UserLoginProvider (在 App.js:30) 在 Router(由 BrowserRouter 创建) 在 BrowserRouter (在 App.js) 中js:29) 中的应用程序未捕获错误:重新渲染太多。 React 限制了渲染的数量以防止无限循环。在 renderWithHooks (react-dom.development.js:14815)
  • 当我添加这个时,我得到了太多的渲染错误......const [team1, setTeam1] = useState([]); const [team2, setTeam2] = useState([]); let i = 0; const tempTeam1 = []; const tempTeam2 = []; while(allPlayers.length &gt; 0) { const random = Math.floor(Math.random() * allPlayers.length); i%2 === 0 ? tempTeam1.push(allPlayers[random]) : tempTeam2.push(allPlayers[random]); allPlayers.splice(random, 1); i++; } setTeam1(tempTeam1); setTeam2(tempTeam2);
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2016-10-11
  • 2019-08-30
  • 1970-01-01
  • 2015-03-22
相关资源
最近更新 更多