2017-10-04 2 views
1

donc je développe une application quiz en quelque sorte, si this est mon état initial de l'application lors de son lancement, je dois également stocker des composants quizApplication.js toute la question et les réponses,Éclate une chaîne en javascript, reactjs

{ 
    question: "I am task oriented in order to achieve certain goals", 
    answers: [ 
     { 
     type: "Brown,D,JP", 
     content: "Hell Ya!" 
     }, 
     { 
     type: " ", 
     content: "Nah" 
     } 
    ] 
}, 

et voici ma fonction pour définir la réponse de l'utilisateur

setUserAnswer(answer) { 
if (answer.trim()) { 
    const answer_array = answer.split(','); 
    const updatedAnswersCount = update(this.state.answersCount, { 
    [answer]: {$apply: (currentValue) => currentValue + 1}, 
    }); 
    this.setState({ 
    answersCount: updatedAnswersCount, 
    answer: answer 
    }); 
} 
} 

J'ai aussi un composant AnswerOption comme si

function AnswerOption(props) { 
return (
    <AnswerOptionLi> 
    <Input 
    checked={props.answerType === props.answer} 
    id={props.answerType} 
    value={props.answerType} 
    disabled={props.answer} 
    onChange={props.onAnswerSelected} 
    /> 
    <Label className="radioCustomLabel" htmlFor={props.answerType}> 
    {props.answerContent} 
    </Label> 
    </AnswerOptionLi> 
); 
} 

Donc ce que j'essaie de faire est que lorsque l'utilisateur clique sur HellYa! il va incrémenter "Brown" et "D" et "JP" par +1, mais en ce moment il me donne une nouvelle valeur de answersCount comme Brown, D, JP: null, alors comment dois-je réaliser cela? Merci beaucoup!

+0

votre question n'est toujours pas claire où est l'implémentation de la fonction de mise à jour? aussi où je le conteneur où vous utilisez le composant AnswerOption? –

+0

également si vous utilisez réagir 16 selon la documentation vous ne devriez pas relayer sur l'état actuel pour définir l'état suivant, car la fonction setState est maintenant asynchrone et plusieurs setState peuvent être patchés ensemble sous le capot, lisez ici: https: // reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous –

Répondre

1

Vous avez divisé votre type, mais vous n'en avez pas encore utilisé.

Comme vous l'avez partager votre type, vous obtiendrez answer_array avec une longueur de 3 contenant ["Brown", "D", "JP"]

const answer_array = answer.split(','); 

Ensuite, vous mettez à jour votre état avec le nombre de réponses mis à jour. Vous effectuez le dessous

const updatedAnswersCount = update(this.state.answersCount, { 
[answer]: {$apply: (currentValue) => currentValue + 1}, 
}); 

Ici answer contient "Brown,D,JP". Puisque vous voulez mettre à jour chacun d'entre eux par +1, passez en boucle sur la valeur de division et mettez-la à jour.

let updatedAnswersCount = null; 

answer_array.forEach((key) => { 
updatedAnswersCount = update(this.state.answersCount, { 
    [answer]: {$apply: (currentValue) => currentValue + 1}, 
}); 
} 

Ici, je suppose que votre type est unique. Signification Brown/D/JP est présent uniquement pour cette réponse et pour rien d'autre. Nous supposons donc que tous auront la même valeur.

+0

foreach a du sens, mais il me donne toujours une nouvelle valeur pour answerCount comme Brown, D, JP: null, mon état d'initialisation dans contructor est comme ça answersCount: { vert: 0, Brown: 0, Bleu: 0, Rouge: 0, A: 0, B: 0, C: 0, D: 0, EI: 0, SN: 0, TF: 0, JP: 0 }, – Irfan

+0

ok, donc pour la première partie je l'ai fait sans passer ce paramètre clé, maintenant j'ai changé la clé param pour répondre, quand j'utilise console.log (updatedAnswersCount) il me donnera ce que je veux par Brown mise à jour 1 et D mise à jour 1 etc. mais quand je reviens à mon état, answersCount seulement mettre à jour la dernière valeur JP par 1, je ne sais pas si vous savez ce que je veux dire – Irfan