#javascript #redux #javascript-objects
#язык JavaScript #возвращение #javascript-объекты
Вопрос:
у меня был проект по игре с соответствующими карточками.игра состоит в том, чтобы выбрать карту в карточной сетке, если содержимое двух тележек одинаковое, поэтому эти две тележки будут соответствовать ее свойству true и будут отображаться зеленым цветом, а в компоненте оценки будут отмечены 2 совпадающие карты и так далее, если карта не совпадает, содержимое цвета карт будет красным, и сюда придет другая функция обработчика, чтобы сделать две карты невидимыми, изменив свойство объекта карты видимым на ложное. Я выпустил эту функцию, она хорошо работает в консоли, но когда я попробую ее в приложении кода, она вообще не работает пожалуйста, помогите мне исправить это, есть компоненты моего кода :
the boardSlice: const initialState = [ {id: 0, contents: 'Provider', visible: true, matched: true}, {id: 1, contents: 'Provider', visible: true, matched: true}, {id: 2, contents: 'selector', visible: true, matched: true}, {id: 3, contents: 'selector', visible: true, matched: true}, {id: 4, contents: 'useSelector()', visible: true, matched: true}, {id: 5, contents: 'useSelector()', visible: true, matched: true}, {id: 6, contents: 'useDispatch()', visible: true, matched: true}, {id: 7, contents: 'useDispatch()', visible: true, matched: true}, {id: 8, contents: 'Pure Function', visible: true, matched: true}, {id: 9, contents: 'Pure Function', visible: true, matched: true}, {id: 10, contents: 'react-redux', visible: true, matched: true}, {id: 11, contents: 'react-redux', visible: true, matched: true}, ]; export const boardReducer = (state = initialState, action) =gt; { switch (action.type) { case 'board/setBoard': let setState = []; action.payload.forEach((element, index) =gt; setState.push({id: index, contents: element, visible: false, matched: false}) ); return setState; case 'board/flipCard': let flipState = [...state]; const cardID = action.payload; flipState[cardID] = {...state[cardID], visible:true} const [index1, index2] = flipState.filter(card =gt; card.visible).map(card =gt; card.id); if (index2 !== undefined) { let card1 = flipState[index1]; let card2 = flipState[index2]; if (card1.contents === card2.contents) { flipState[index1] = {...card1, visible: false, matched: true}; flipState[index2] = {...card2, visible: false, matched: true}; } } return flipState; case 'board/resetUnmatchedCards': let newState = [...state]; let [indexa, indexb] = newState.filter(card =gt; card.visible === true amp;amp; card.matched === false).map(card =gt; card.id); if (indexb !== undefined) { let cardA = newState[indexa]; let cardB = newState[indexb]; newState[indexa] = {...cardA, visible: action.payload}; newState[indexb] = {...cardB, visible: action.payload} } return newState case 'board/resetCards': return state.map(card =gt; ({...card, visible: false})); default: return state; } } const wordPairs = [ 'Provider', 'Provider', 'selector', 'selector', 'useSelector()', 'useSelector()', 'useDispatch()', 'useDispatch()', 'Pure Function', 'Pure Function', 'react-redux', 'react-redux', ] const randomWords = () =gt; { let words = [] let newWordPairs = [...wordPairs] const reps = newWordPairs.length for (let i = 0 ; i lt; reps ; i ) { const wordIndex = Math.floor(Math.random() * newWordPairs.length); words.push(newWordPairs[wordIndex]) newWordPairs.splice(wordIndex, 1) } return words; } // action creators export const setBoard = () =gt; { const words = randomWords() return { type: 'board/setBoard', payload: words } } export const flipCard = (id) =gt; { return { type: 'board/flipCard', payload: id } } export const resetCards = (indices) =gt; { return { type: 'board/resetCards' } }; export const resetUnmatchedCards = () =gt; { return { type: 'board/resetUnmatchedCards', payload: false } } // Add selector export statments below export const selectBoard = (state) =gt; { return ( state.board.map(card=gt; ({ id: card.id, contents: card.contents }) ))} export const selectVisibleIDs = state =gt; { return ( state.board.filter(card =gt; card.visible) .map(card =gt; card.id) ) } export const selectMatchedIDs = state =gt; { return ( state.board.filter(card =gt; card.matched) .map(card =gt; card.id)); };
the App component : import './App.css'; import React from 'react'; import { Score } from './features/score/Score.js'; import { Board } from './features/board/Board.js'; import { useDispatch } from 'react-redux'; import { setBoard, resetCards } from './features/board/boardSlice'; // Add import statements below const App = () =gt; { // Add dispatch variable below const dispatch = useDispatch(); const startGameHandler = () =gt; { // Add action dispatch below dispatch(setBoard()) }; const tryAgainHandler = () =gt; { // Add action dispatch below dispatch(resetCards()) }; return ( lt;div className="App"gt; lt;Score /gt; lt;Board /gt; lt;footer className="footer"gt; lt;button onClick={startGameHandler} className="start-button"gt; Start Game lt;/buttongt; lt;button onClick={tryAgainHandler} className="try-new-pair-button"gt; Try New Pair lt;/buttongt; lt;/footergt; lt;/divgt; ); }; export default App;
the board component : import React from 'react'; import { CardRow } from './cardRow/CardRow.js'; // Add import statements below import { useSelector } from 'react-redux'; import { selectBoard } from './boardSlice'; export const Board = () =gt; { // Add selected data variable and implement below const currentBoard = useSelector(selectBoard); const numberOfCards = currentBoard.length; const columns = 3; const rows = Math.floor(numberOfCards / columns); const getRowCards = (row) =gt; { const rowCards = []; for (let j = 0; j lt; columns; j ) { const cardIndex = row * columns j; // Implement selected data below rowCards.push(currentBoard[cardIndex]); } return rowCards; }; console.log(currentBoard) let content = []; for (let row = 0; row lt; rows; row ) { const rowCards = getRowCards(row); content.push( lt;CardRow key={row} cards={rowCards} /gt; ); } return lt;div className="cards-container"gt;{content}lt;/divgt;; };
the cardRow.js: import React from 'react'; import { Card } from './card/Card.js'; import {selectMatchedIDs } from '../boardSlice' export const CardRow = ({ cards }) =gt; { const content = cards.map(card =gt; lt;Card key={card.id} id={card.id} contents={card.contents} /gt;) return lt;gt;{content}lt;/gt;; };
the Card.js: import React, {useEffect} from 'react'; // Add import statements below import { useSelector, useDispatch } from 'react-redux'; import { selectVisibleIDs, flipCard, selectMatchedIDs, } from '../../boardSlice'; import { resetCards, resetUnmatchedCards } from '../../boardSlice' let cardLogo = "https://static-assets.codecademy.com/Courses/Learn-Redux/matching-game/codecademy_logo.png"; export const Card = ({ id, contents }) =gt; { // Add selected data and dispatch variables below const visibleIDs = useSelector(selectVisibleIDs) const dispatch = useDispatch(); const matchedIDs = useSelector(selectMatchedIDs); console.log(visibleIDs) console.log(matchedIDs); // flip card action const flipHandler = (id) =gt; { // Add action dispatch below dispatch(flipCard(id)) }; const resetHandler = () =gt; { dispatch(resetUnmatchedCards) } let cardStyle = 'resting'; let click = () =gt; flipHandler(id); let cardText = ( lt;img src={cardLogo} className="logo-placeholder" alt="Card option" /gt; ); // 1st if statement // implement card id array membership check if (visibleIDs.includes(id) || matchedIDs.includes(id)) { cardText = contents; click = () =gt; {}; } // 2nd if statement // implement card id array membership check if (matchedIDs.includes(id)) { cardStyle = 'matched'; } else { cardStyle = 'no-match'; } // 3rd if statement // implement number of flipped cards check if (visibleIDs.length === 2) { if (cardStyle === 'no-match' ) { click = () =gt; resetHandler(); } click = ()=gt; {}; } return ( lt;button onClick={click} className={`card ${cardStyle}`}gt; {cardText} lt;/buttongt; ); };
Комментарии:
1. Пожалуйста, отформатируйте свой вопрос так, чтобы он был немного более читабельным. Весь абзац состоит из одного предложения, я действительно не могу понять, о чем вы спрашиваете. Также, пожалуйста, постарайтесь включить только код, относящийся к возникшей у вас проблеме.
2. хорошо, мой друг, ты прав
Ответ №1:
итак, проблема в том, что я хочу изменить кнопку щелчка на другую функцию, чтобы сделать это, когда сначала у каждой карты был этот объект {идентификатор:идентификатор карты, содержимое: содержимое карты, видимое: ложь, совпадение: ложь}, поэтому сначала, когда пользователь нажимает на две карты действием «ФлипКарт», карта.видимое становится истинным, если первая карта.содержимое совпадает со второй картой.содержимое, поэтому свойство card.matched для двух карт станет истинным, поэтому я хочу добавить еще одну функцию для сброса двух карт.видимое становится ложным, когда первая карта.содержимое не совпадает со второй картой.содержимое, поэтому это мой код карты компонента. :
import React, {useEffect} from 'react'; // Add import statements below import { useSelector, useDispatch } from 'react-redux'; import { selectVisibleIDs, flipCard, selectMatchedIDs, } from '../../boardSlice'; import { resetCards, resetUnmatchedCards } from '../../boardSlice' let cardLogo = "https://static-assets.codecademy.com/Courses/Learn-Redux/matching-game/codecademy_logo.png"; export const Card = ({ id, contents }) =gt; { // Add selected data and dispatch variables below const visibleIDs = useSelector(selectVisibleIDs) const dispatch = useDispatch(); const matchedIDs = useSelector(selectMatchedIDs); console.log(matchedIDs); // flip card action const flipHandler = (id) =gt; { // Add action dispatch below dispatch(flipCard(id)) }; const resetHandler = () =gt; { dispatch(resetCards) } let cardStyle = 'resting'; let click = () =gt; flipHandler(id); let cardText = ( lt;img src={cardLogo} className="logo-placeholder" alt="Card option" /gt; ); // 1st if statement // implement card id array membership check if (visibleIDs.includes(id) || matchedIDs.includes(id)) { cardText = contents; click = () =gt; {}; } // 2nd if statement // implement card id array membership check if (matchedIDs.includes(id)) { cardStyle = 'matched'; } else { cardStyle = 'no-match'; } console.log(visibleIDs.every(id =gt; matchedIDs.includes(id))) // 3rd if statement // implement number of flipped cards check if (visibleIDs.length === 2 ) { if (cardStyle === 'no-match' amp;amp; visibleIDs.every(id =gt; !matchedIDs.includes(id))) { click = () =gt; resetHandler(); } else { click = () =gt; {}; } } return ( lt;button onClick={click} className={`card ${cardStyle}`}gt; {cardText} lt;/buttongt; ); };