#javascript #reactjs #components #react-props
#javascript #reactjs #Компоненты #реагировать-реквизит
Вопрос:
Я получаю эту ошибку, когда пытаюсь передать свою функцию дочернему компоненту: TypeError: props.replaceVariables is not a function
Я что-то упускаю? Насколько я знаю, я передаю свою функцию правильно. Поэтому я не могу решить, находится ли проблема внутри Player.js или MultipleChoiceType.js . Мой родительский компонент:
class Player extends React.Component {
constructor(props) {
super(props);
this.replaceVariables = this.replaceVariables.bind(this);
}
state = {
scope: {},
variables: this.props.question.data.variables,
...
}
_renderAnswerInputs(part, partIndex) {
switch (part.questionType) {
case Constants.PartMultipleChoiseQuestionType:
return part.solutions.map((solution, solutionIndex) => {
return <MultipleChoiceType
replaceVariables={this.replaceVariables}
choices={solution[0].choices}
playerAnswer={this.state.myAnswerPartData?.answers[0]}
selectedChoiceChanged={(choiceIndex) => this.onChangedMyMultipleChoise(solution[0].choices[choiceIndex], solutionIndex)}
edit={false} />
})
}
}
replaceVariables(q) {
for (var key in this.state.scope) {
q = this.replaceAll(q, '<span class="mord">' key '</span>', '<span class="mord mathdefault">' this.state.scope[key] '</span>');
q = this.replaceAll(q, '<span class="mord mtight">' key '</span>', '<span class="mord mathdefault">' this.state.scope[key] '</span>');
};
return q;
}
}
...
Мой дочерний компонент:
function MultipleChoiceType(props) {
const dispatch = useDispatch()
return (
<div>
{
props.choices?.map((choice, cIndex) => (
<div style={{ display: 'flex', padding: 5 }} key={cIndex}>
<div dangerouslySetInnerHTML={{ __html: props.replaceVariables(choice.value) }} />
</div>
))
}
</div>
)
}
...
Комментарии:
1.
_renderAnswerInputs
также может потребоваться привязка кthis
в конструкторе. Не могу сказать наверняка, но для проверки вы можете войти в консольthis.replaceVariables
внутри_renderAnswerInputs
функции. Если это не определено, это ваша проблема.2. @BrianThompson Я просто ограничил это как
this._renderAnswerInputs = this._renderAnswerInputs.bind(this)
, но все еще получаю ту же ошибку3. Хорошо, вы регистрировали функцию в консоли внутри этого метода? Это сузило бы ваш поиск отладки, чтобы узнать, определено ли оно там или нет (или как-то не определено как функция)
4. @BrianThompson да, вот что отображалось в журнале:
function () { [native code] }
. Я думаю, что проблема каким-то образом связана с тем, что MultipleChoiceType является функцией, а не классом…5. Сомнительно, что это связано с функцией против класса. Я не могу найти здесь ничего явно неправильного. Есть ли какой-либо другой соответствующий код? Не могли бы вы привести пример, пригодный для выполнения?
Ответ №1:
Я попытался повторить то же поведение, и оно работает отлично.
https://stackblitz.com/edit/react-fx2gso?file=src/App.js
Должно быть, причиной этой проблемы было что-то другое.
Ответ №2:
Используйте => функции со стрелками, тогда вам не нужно привязывать функцию в конструкторе Попробуйте привязать значение к функции
Редактировать => попробуйте использовать функции со стрелками вместо старого синтаксиса
<MultipleChoiceType
replaceVariables={value=>this.replaceVariables(value)}
choices={solution[0].choices}
playerAnswer={this.state.myAnswerPartData?.answers[0]}
selectedChoiceChanged={(choiceIndex) =>
this.onChangedMyMultipleChoise(solution[0].choices[choiceIndex],
solutionIndex)}
edit={false} />