reactjs - React / Typescript:单击另一个元素时如何触发一个元素上的功能?
问题描述
我正在编写一个迷你游戏,其中两张仓鼠图片争先恐后地看谁最可爱。
每次用户点击获胜图片时,我都需要在我的数据库中更新在该比赛中竞争的每个仓鼠对象的获胜/失败次数。
不过,我完全不知道如何在丢失的仓鼠对象上触发 updateDefeats 函数,这个对象还没有被点击。
这是我的代码:
import { useEffect, useState } from 'react';
import { Hamster } from '../../models/Hamster';
import FighterCard from './FighterCard'
import '../../styles/game.css'
type Hamsters = Hamster;
const baseUrl = 'http://localhost:1337';
const Game = () => {
const [fighters, setFighters] = useState<Hamsters[] | null>(null)
useEffect(() => {
getFighters(setFighters)
}, [])
function newGame() {
getFighters(setFighters)
}
function updateWin(id: string, wins: number, games: number) {
const newWins = wins + 1;
const newGames = games + 1;
return fetch(baseUrl + '/hamsters/' + id, {
method: 'PUT',
headers: { "Content-Type": "application/json" },
body: JSON.stringify({wins: newWins, games: newGames})
})
}
function updateDefeats(id:string, defeats: number, games: number) {
const newDefeats = defeats + 1;
const newGames = games + 1;
return fetch(baseUrl + '/hamsters/' + id, {
method: 'PUT',
headers: { "Content-Type": "application/json" },
body: JSON.stringify({defeats: newDefeats, games: newGames})
})
}
return (
<div className='game'>
<h2>Let the fight begin!</h2>
<p>Click on the cutest hamster</p>
<section className="fighters">
{fighters
? fighters.map(fighter => (
<FighterCard fighter={fighter} key={fighter.id} updateWin={updateWin}/>
))
: 'Loading fighters...'}
</section>
<button onClick={newGame}>New Game</button>
</div>
)
};
async function getFighters(saveFighters: any) {
const response = await fetch(baseUrl + '/hamsters');
const data = await response.json()
const fighters = await data.sort(() => .5 - Math.random()).slice(0,2)
saveFighters(fighters)
};
export default Game
任何人都可以帮助我吗?提前致谢 :)
解决方案
很抱歉缺少 TS,但添加类型不会花费您太多时间;)。您可以创建一个fighters
依赖回调,然后将其放入您的onClick
:
const concludeTheFight = useCallback((winningFighter, ...) => {
const winningFighterFilter = fighter => fighter !== winningFighter
const defeatedFighters = fighters.filter(winningFighterFilter)
const defeatUpdates = defeatedFighters.map(updateDefeats)
const winUpdate = updateWin(winningFighter)
// if you need the responses to update your fighters:
const defeatResponses = await Promise.all(defeatUpdates)
const winResponse = await winUpdate
// I think you will figure out how to deal with them by yourself :)
}, [fighters])
推荐阅读
- arrays - 使用一些规则在 Node.js 中打乱数组
- javascript - 在需要时保持持久连接和推送事件
- python - 在 selenium 中单击 select2 下拉列表时出现问题
- javascript - 如何连续只附加一次事件处理程序
- python - 如何从 twitter 页面探索中提取主题标签?
- r - 删除 NA 数据,但在 R 中有一定的条件
- html - 无论图像大小如何,如何保持按钮位置
- python - 新/重复值的数据帧时间戳过滤器
- entity-framework - 使用急切加载时,Entity Framework 是否将所有相关实体加载到无限深度
- java - Stream中“先过滤后映射”和“先映射后过滤”的性能是否不同?