React/next.js: эффективно определение тайного статуса для персонажей с несколькими призваниями в веб -приложении D & DJavascript

Форум по Javascript
Ответить
Anonymous
 React/next.js: эффективно определение тайного статуса для персонажей с несколькими призваниями в веб -приложении D & D

Сообщение Anonymous »

Я разрабатываю веб-приложение, вдохновленное D & D, где персонажи могут иметь несколько призваний (классы). Мне нужно правильно определить, является ли персонаж «тайной» (может использовать магию) на основе их призваний. Персонаж считается тайным, если хотя бы один из их призваний имеет arcanewielding = true в базе данных.// In schema.prisma
model Character {
// ...other fields
vocations String[] @default([])
// ...more fields
}
< /code>
У меня проблемы с расчетом MANA в моем компоненте BodyandBurden, который должен знать, является ли символ абсолютно для расчета правильного значения MANA. < /p>
Вот моя текущая реализация: < /p>
// In BodyAndBurden.tsx
// Use the direct vocation arcane status hook
const { isArcane, loading: arcaneStatusLoading } = useVocationArcaneStatus(character.vocations);

// Memoize character mana calculation
const characterMana = useMemo(() => {
// Determine if the character is arcane based solely on the hook value
const isCharacterArcane = isArcane === true;

// Calculate mana based on whether the character is arcane
const calculatedMana = calculateCharacterMana(
character.abilityCON,
character.abilityINT,
isCharacterArcane
);

return calculatedMana;
}, [
character.abilityCON,
character.abilityINT,
isArcane,
arcaneStatusLoading,
vocation
]);
< /code>
Крюк, который проверяет статус Arcane: < /p>
// In useVocationArcaneStatus.ts
export function useVocationArcaneStatus(vocations: string | string[] | null) {
const [isArcane, setIsArcane] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);

useEffect(() => {
if (!vocations) {
setIsArcane(false);
setLoading(false);
return;
}

// Handle both string and array inputs
let vocationNames: string[] = [];
let vocationNameForApi: string;

if (Array.isArray(vocations)) {
// If vocations is already an array, use it directly
vocationNames = vocations.filter(Boolean).map(v => v.toLowerCase());
vocationNameForApi = vocations.join(',');
} else {
// If vocations is a string, split it (for backward compatibility)
vocationNames = vocations.split(/[,;]/).map(v => v.trim().toLowerCase());
vocationNameForApi = vocations;
}

const fetchArcaneStatus = async () => {
try {
// Fetch from API
const response = await dataFetcher.fetch(
`/api/player-sheet/vocation-arcane-status?name=${encodeURIComponent(vocationNameForApi)}`
);

setIsArcane(response.isArcane);
setError(null);
} catch (err) {
// Error handling...
} finally {
setLoading(false);
}
};

fetchArcaneStatus();
}, [vocations]);

return { isArcane, loading, error };
}
< /code>
конечная точка API: < /p>
// In vocation-arcane-status/route.ts
export async function GET(request: NextRequest) {
// ...
// Handle multiple vocations (comma or semicolon separated)
const vocationNames = vocationName.split(/[,;]/).map(v => v.trim()).filter(Boolean);

// If there are multiple vocations, check each one
if (vocationNames.length > 1) {
const vocations = await db.vocation.findMany({
where: {
name: {
in: vocationNames
}
},
select: {
name: true,
arcaneWielding: true
}
});

// If any vocation is arcane, return true
const isArcane = vocations.some(v => v.arcaneWielding);
return { isArcane };
}
// ...
}
< /code>
Функция расчета MANA: < /p>
export const calculateCharacterMana = (
constitutionScore: number,
intelligenceScore: number,
isArcane: boolean
): number => {
const constitutionModifier = calculateModifier(constitutionScore);
const intelligenceModifier = calculateModifier(intelligenceScore);

if (isArcane) {
return 10 + constitutionModifier + intelligenceModifier;
} else {
return 5 + constitutionModifier;
}
};
< /code>
Мой вопрос < /strong>
Я исправил предыдущий вопрос, в котором мы жестко кодировали «арканист» как тайное призвание вместо правильного запроса базы данных. Теперь я хочу убедиться, что моя реализация правильно обрабатывает несколько призваний. Я обеспокоен: < /p>

Условия гонки в крючке < /li>
Правильная обработка состояния нагрузки < /li>
Обеспечение того, чтобы расчет MANA правильный, когда изменяются призывы < /li>
Оптимизировать запросы DataBase для этой общей работы < /li>

< /br />
< /br />
pretaves для этой общей операции < /li>

< /br />
< /br />
< /br />
. Улучшение этой реализации? Я особенно заинтересован в лучших практиках для обработки производного состояния, которое зависит от множества асинхронных источников данных.

Подробнее здесь: https://stackoverflow.com/questions/795 ... th-multipl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»