Я пытаюсь получить доступ к своему состоянию, называемому activeCards, из функции в компоненте реакции. У меня есть доступ к нему в Use Effect ... но я хочу, чтобы функция запускалась только при нажатии кнопки.
Функция reorderActiveCardsDown берет массив из состояния ... и переупорядочивает его ... а затем возвращает массив. Он работал в моих классовых компонентах, но у меня возникли проблемы с его использованием с функциональными компонентами.
Я могу console.log состояние из useEffect, и он отлично работает ... но если я console.log состояние из функции, оно пусто.
Я предполагаю, что мой вопрос - я использую useEffect в этом случае - чтобы передать информацию обратно в новую функцию? Если бы я хотел, чтобы функция запускалась каждый раз ... я мог бы просто включить ее в useEffect ... но я хочу, чтобы она запускалась только тогда, когда я нажимаю эту кнопку.
Спасибо!
useEffect(() => {
console.log('active cards updated')
// prints the whole array to the console.
}, [activeCards])
const reorderActiveCardsDown = () => {
let oldArray = []
console.log(activeCards)
// prints empty array to the console, hence no access to the state yet.
oldArray.push(activeCards);
console.log(oldArray[0])
const swapPositions = (array, a ,b) => {
[array[a], array[b]] = [array[b], array[a]]
}
swapPositions(oldArray[0], index, index+1);
setActiveCards(oldArray[0]);
}
Вот полный код - компонент делает выборку в мой api с одним идентификатором, чтобы получить массив идентификаторов. Это происходит из функции FetchIDS (). После получения массива он устанавливается в состояние cumulativeList. Каждый полученный идентификатор представляет собой карту - таким образом я могу позволить пользователю добавлять или удалять карты, которые они хотят.
После обновления состояния «cumulativeList» я вызываю convertIdToCard () из функции useEffect. Каждый идентификатор извлекает информацию о карте и преобразует ее в компонент, который хранится в состоянии «activeCards». convertIdToCard () получает информацию о карте и вызывает CreateQuoteCards (). CreateQuoteCards () создает компонент для добавления в список ActiveCards. В конце CreateQuoteCards () я обновляю activeCardsList. Функция рендеринга отображает список.
Теперь пользователь может видеть каждую карту. Каждой карточке также передается функция через props - moveCardDown (). Когда пользователь нажимает кнопку, чтобы изменить порядок конкретной карты, moveCardDown () переупорядочивает cumulativeList (список идентификаторов, которые будут сохранены в базе данных). Это работает до сих пор. Теперь moveCardDown () вызывает функцию, с которой у меня возникли проблемы ... reorderActiveCardsDown ().
Вот полный код!
import React, { Component, useState, useEffect } from 'react'
import NewCardModal from './SetupCards/NewCardModal';
import BaseCostCard from './SetupCards/BaseCostCard';
import DatePickerCard from './SetupCards/DatePickerCard';
import TimedRateCard from './SetupCards/TimedRateCard';
import TextCard from './SetupCards/TextCard';
import SelectCard from './SetupCards/SelectCard';
import CheckboxCard from './SetupCards/CheckboxCard';
import NumberCard from './SetupCards/NumberCard';
import SliderCard from './SetupCards/SliderCard'
import { Container } from 'reactstrap';
let updateCumulativeList = true;
const AqgSetup2 = (props) => {
const [ _id, setId ] = useState("5e888116ea81f0eae86517de");
const [ activeCards, setActiveCards] = useState([]);
const [ cumulativeList, setCumulativeList] = useState([]);
const fetchIDS = async () => {
try {
const response = await fetch(`/api/autoquotegenerators/5e888116ea81f0eae86517de`);
const responseData = await response.json();
setCumulativeList(responseData.quoteGenerator)
// console.log(responseData.quoteGenerator)
} catch (error) {
console.error(error);
}
}
useEffect(() => {
fetchIDS();
console.log('fetched')
}, [])
useEffect(() => {
if(updateCumulativeList){
setTimeout( () => {
convertIdToCard();
updateCumulativeList = false
},300)
}else {
console.log(updateCumulativeList)
}
cumulativeListPut();
}, [cumulativeList]);
useEffect(() => {
console.log('active cards updated')
}, [activeCards])
const convertIdToCard = () => {
const quoteCards = []
quoteCards.push(cumulativeList.map(id => {return id}))
const selfMap = async (quoteCards) => {
if(quoteCards.length > 0){
try {
let card = quoteCards.shift();
const response = await fetch(`/api/autoquotegenerators/${card}`);
const responseData = await response.json();
createQuoteCards(responseData);
selfMap(quoteCards);
} catch (error) {
console.error(error);
}
}
}
selfMap(quoteCards[0]);
}
const createQuoteCards = (quoteCard) => {
let display = [];
if(quoteCard.quoteGenerator[0].cardType === "base"){
display.push(
<BaseCostCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
);
}else if(quoteCard.quoteGenerator[0].cardType === "date"){
display.push(
<DatePickerCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} advanced={quoteCard.quoteGenerator[0].advanced} sunday={quoteCard.quoteGenerator[0].sunday} monday={quoteCard.quoteGenerator[0].monday} tuesday={quoteCard.quoteGenerator[0].tuesday} wednesday={quoteCard.quoteGenerator[0].wednesday} thursday={quoteCard.quoteGenerator[0].thursday} friday={quoteCard.quoteGenerator[0].friday} saturday={quoteCard.quoteGenerator[0].saturday} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
);
}else if(quoteCard.quoteGenerator[0].cardType === "timed"){
display.push(
<TimedRateCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
)
}else if(quoteCard.quoteGenerator[0].cardType === "text"){
display.push(
<TextCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
)
}else if(quoteCard.quoteGenerator[0].cardType === "select"){
display.push(
<SelectCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} selectOptions={quoteCard.quoteGenerator[0].selectOptions}deleteCard={deleteCard} moveCardDown={moveCardDown} />
)
}else if(quoteCard.quoteGenerator[0].cardType === "check"){
display.push(
<CheckboxCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
)
}else if(quoteCard.quoteGenerator[0].cardType === "number"){
display.push(
<NumberCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
)
}else if(quoteCard.quoteGenerator[0].cardType === "slider"){
display.push(
<SliderCard id={quoteCard._id} cardTitle={quoteCard.quoteGenerator[0].cardTitle} charge={quoteCard.quoteGenerator[0].charge} deleteCard={deleteCard} moveCardDown={moveCardDown}/>
)
}
setActiveCards(activeCards => [...activeCards, display[0]])
}
const baseCostCard = (id) => {
setActiveCards(activeCards => [...activeCards, <BaseCostCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const datePickerCard = (id) => {
setActiveCards(activeCards => [...activeCards, <DatePickerCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const timedRateCard = (id) => {
setActiveCards(activeCards => [...activeCards, <TimedRateCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const textCard = (id) =>{
setActiveCards(activeCards => [...activeCards, <TextCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const selectCard = (id) =>{
setActiveCards(activeCards => [...activeCards, <SelectCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown} selectOptions={[]} /> ])
cumulativeListFetch(id);
}
const checkboxCard = (id) =>{
setActiveCards(activeCards => [...activeCards, <CheckboxCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const numberCard = (id) => {
setActiveCards(activeCards => [...activeCards, <NumberCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const sliderCard = (id) => {
setActiveCards(activeCards => [...activeCards, <SliderCard id={id} deleteCard={deleteCard} moveCardDown={moveCardDown}/> ])
cumulativeListFetch(id);
}
const moveCardDown = (id) => {
let oldArray = []
oldArray.push(cumulativeList);
let index = oldArray[0].indexOf(id);
let newArray = oldArray[0].filter(card => {
return card !== id;
});
newArray.splice(index + 1, 0, id)
setCumulativeList(newArray)
reorderActiveCardsDown();
}
const displayExtraModal = () => {
if(activeCards.length > 0){
return <NewCardModal baseCostCard={baseCostCard} datePickerCard={datePickerCard} timedRateCard={timedRateCard} textCard={textCard} selectCard={selectCard} checkboxCard={checkboxCard} numberCard={numberCard} sliderCard={sliderCard}/>
}
}
const reorderActiveCardsDown = () => {
let oldArray = []
console.log(activeCards)
oldArray.push(activeCards);
// console.log(oldArray[0])
// const swapPositions = (array, a ,b) => {
// [array[a], array[b]] = [array[b], array[a]]
// }
// swapPositions(oldArray[0], index, index+1);
// setActiveCards(oldArray[0]);
}
const deleteCard = (id) => {
setCumulativeList(cumulativeList => [...cumulativeList.filter(card => {
return card !== id
})])
removeFromCumulativeList(id);
}
const removeFromCumulativeList = () => {
let quoteGeneratorTemplate = {
"quoteGenerator": cumulativeList
}
fetch(`/api/autoquotegenerators/${_id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
},
body: JSON.stringify(quoteGeneratorTemplate),
})
.then((response) => response.json())
.then((data) => {
console.log('Updated:', data);
})
.catch((error) => {
console.error('Error:', error);
});
}
const makeNumber = () => {
Math.floor(Math.random()*10000)
}
const cumulativeListFetch = (id) => {
setCumulativeList( cumulativeList => [...cumulativeList, id])
}
const cumulativeListPut = () => {
let quoteGeneratorTemplate = {
"quoteGenerator": cumulativeList
}
fetch(`/api/autoquotegenerators/${_id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json; charset=UTF-8',
},
body: JSON.stringify(quoteGeneratorTemplate),
})
.then((response) => response.json())
.then((data) => {
console.log('Updated:', data);
})
.catch((error) => {
console.error('Error:', error);
});
}
return (
<Container className="d-flex flex-column justify-content-center">
<NewCardModal baseCostCard={baseCostCard} datePickerCard={datePickerCard} timedRateCard={timedRateCard} textCard={textCard} selectCard={selectCard} checkboxCard={checkboxCard} numberCard={numberCard} sliderCard={sliderCard}/>
{activeCards.map(card => {
return <div key={makeNumber()}>{card}</div>
})}
{displayExtraModal()}
</Container>
)
}
export default AqgSetup2
activeCards
и когда вызываетсяreorderActiveCardsDown
? - person Phoenix1355   schedule 09.04.2020