#javascript #arrays #reactjs #ecmascript-6 #react-redux
#javascript #массивы #reactjs #ecmascript-6 #реагировать-redux
Вопрос:
Я работаю над проектом React. Я использую фильтр поиска в своем проекте, но в то же время, когда пользователь вводит что-либо в поле поиска, я получаю сообщение об ошибке, которое this.state.renderData.filter is not a function
. Я новичок в ReactJS.
Код
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
Item: 5,
skip: 0
}
this.handleClick = this.handleClick.bind(this);
}
urlParams() {
return `http://localhost:3001/meetups?filter[limit]=${(this.state.Item)}amp;amp;filter[skip]=${this.state.skip}`
}
handleClick() {
this.setState({skip: this.state.skip 1})
}
render() {
return (
<div>
<a href={this.urlParams()}>Example link</a>
<pre>{this.urlParams()}</pre>
<button onClick={this.handleClick}>Change link</button>
</div>
)
}
}
ReactDOM.render(<Example/>, document.querySelector('div#my-example' ))
Комментарии:
1. Вы уверены, что
nextProps.searchData
это массив?2. Можете ли вы перед тем, как пытаться ее отфильтровать, выполнить выборку
console.log(this.state.renderData)
и сообщить, что это такое?3. @larz. Это дает пустой массив
4. @UjinT34 . Да, это массив
5. Ну,
[].filter
совершенно определенно является функцией. Возможно, вы упускаете что-то еще, о чем пытается сообщить вам сообщение об ошибке?
Ответ №1:
Проблема в том, что ваше начальное состояние
this.state = {
renderData:[],
...
}
перезаписывается при componentWillReceiveProps(nextProps, renderProps) {...}
вызове.
Рассмотрим следующий вызов connect(...)
:
connect(
mapStateToProps,
{ getParties, searchData }
)(Organization)
Второй аргумент connect()
функции — обычно именуемой как mapDispatchToProps
, которая в вашем случае является объектом — ожидает, что ее атрибутами будут создатели действий (функции). Вызов connect(...)
установит для searchData
prop вашего компонента значение action creator, которое вы импортируете с помощью import { getParties, searchData } from "../../actions";
.
Потому что
componentWillReceiveProps(nextProps, renderProps) {
...
this.setState({
...,
renderData: nextProps.searchData
});
...
}
вызывается перед рендерингом вашего компонента, значение this.state.renderData
не будет []
, но создателем действия и, следовательно, filter
не является функцией в вашем создателе действия.