#javascript #reactjs
#javascript #reactjs
Вопрос:
Я новичок в ReactJS, и я работаю над фильтруемой галереей, но теперь я смотрю на пример мышления в ReactJS, и я увидел, что они создают разные классы для каждого компонента. Я этого не делал, но теперь я пытаюсь это сделать, сначала мой код выглядел так: `
var SearchBar = React.createClass({
getInitialState() {
return { text:'', array: this.props.array};
},
handleChange(event) {
var array = this.filterList(event.target.value);
this.setState({ text: event.target.value, array: array });
return this.state.text;
},
render() {
var arrayComponents = this.state.array.map(function(photo) {
return <li className="photo photo-name">{photo.name} <img className="photo" src={photo.link}/></li>;
});
return <div>
<h1>Hello, {this.props.name}</h1>
<p>{this.state.text}</p>
<input type="text" onChange={this.handleChange} />
<ul>
{arrayComponents}
</ul>
</div>;
},
filterList (filterText) {
var updatedList = this.props.array,
filterTextLength = filterText.length;
return updatedList.filter(function(item){
var splitName = item.name.toLowerCase().slice(0, filterTextLength);
var lowerCaseFilterText = filterText.toLowerCase();
return splitName === lowerCaseFilterText;
});
}
});
Теперь я хочу создать другой класс ImageList, который должен включать var arrayComponents
, но если я сделаю это:
var ImageList = React.createClass({
render() {
var arrayComponents = this.props.array.map(function(photo) {
return <li className="photo photo-name">{photo.name} <img className="photo" src={photo.link}/></li>;
});
<ul>
{arrayComponents}
</ul>
}
})
и чем в функции рендеринга add <ImageList array={array}/>
вместо <ul>{arrayComponent}</ul>
этого выдает мне ошибку о том Cannot read property 'map' of undefined
, как мне передать состояние массива в этот класс ImageList.
Вот ссылка на codepen: ССЫЛКА
Комментарии:
1. Это
<ul>
выходит за рамки возврата… Кроме того, просто передайте вarray
качестве реквизита при использовании компонента:<ImageList array={array_here} />
Ответ №1:
Я внес следующие изменения в ваш код: http://codepen.io/PiotrBerebecki/pen/zKRAGZ
1) Передайте состояние массива в этот ImageList
класс
<ImageList array={this.state.array} />
2) Добавьте return
оператор в render
метод ImageList
// Add return
return (
<ul>
{arrayComponents}
</ul>
);
3) Добавьте key
атрибут к li
тегу при использовании метода map:
var arrayComponents = this.props.array.map(function(photo, index) {
// -------------------------------
// Add index to the li tag
// ----------------vvvvvvvvvvv
return <li key={index} className="photo photo-name">{photo.name} <img className="photo" src={photo.link}/></li>;
});
Документы React: https://facebook.github.io/react/docs/multiple-components.html#dynamic-children
Ответ №2:
Вам нужно передать текущее состояние массива. Итак, ваше объявление компонента должно выглядеть следующим образом:
<ImageList array={this.state.array}/>
Ответ №3:
Здесь я вижу три проблемы. Первый,
var ImageList = React.createClass({
render() {
var arrayComponents = this.props.array.map(function(photo) {
return <li className="photo photo-name">{photo.name} <img className="photo" src={photo.link}/></li>;
});
<ul>
{arrayComponents}
</ul>
}
})
вы должны сказать:
return (<ul>
{arrayComponents}
</ul>)
Во-вторых, когда вы используете динамически сгенерированные коды, вы должны добавить key
к ним prop:
var arrayComponents = this.props.array.map(function(photo) {
return <li key={SOME_KEY} className="photo photo-name">{photo.name} <img className="photo" src={photo.link}/></li>;
});
В-третьих, в вашем codepen, когда вы говорите :
<ImageList array={array}/>
вы ссылаетесь на глобальную переменную array
(вы объявляете ее в верхней части своего кода), вы имеете в виду:
<ImageList array={this.state.array}/>