Render массива из props

207
26 июня 2018, 13:10

Пишу свой поиск по массиву, хочу изначально отображать массив таким какой он есть и потом при изменении value менять само отображение массива. Не понимаю почему он не отображается в принципе, явно что-то не так делаю, подскажите пожалуйста. В Реакте новичек, поэтому любая критика очень приветствуется, заранее благодарен.

Мой компонент Search:

import React, {Component} from 'react';
export default class Search extends Component {
    constructor(props) {
        super(props);
        this.listItems = this.props.items;
    }
    state = {
        value: ''
    };
    renderArr = (arr) => {
        return <ul>
            {arr.map((i, key) => {
                return <li key={key}>{i}</li>
            })}
        </ul>
    };

    filterArr = e => {
        const value = e.target.value.toLowerCase();
        this.listItems = this.props.items.filter(item => {
            return item.toLowerCase().includes(value);
        });
        console.log(this.listItems);
        return this.renderArr(this.listItems);
    };
    componentDidMount() {
        this.setState({
            value: this.search.value
        });
    }
    render() {
        return (
            <div className="">
                <input type="text"
                       ref={input => this.search = input}
                       onChange={this.filterArr}
                />

            </div>
        )
    }
}
Answer 1

Проблему решил записав полученный в props массив в state, но не знаю насколько это правильно...

import React, {Component} from 'react';
export default class Search extends Component {
    constructor(props) {
        super(props);
        this.listItems = this.props.items;
    }
    state = {
        value: '',
        arr: []
    };
    renderArr = (arr) => {
        return <ul>
            {arr.map((i, key) => {
                return <li key={key}>{i}</li>
            })}
        </ul>
    };

    filterArr = e => {
        const value = e.target.value.toLowerCase();
        this.setState({
            arr: this.props.items.filter(item => {
                return item.toLowerCase().includes(value);
            })
        })
    };
    componentDidMount() {
        this.setState({
            value: this.search.value
        });
    }
    componentWillMount() {
        this.setState({
            arr: this.props.items
        })
    }
    render() {
        return (
            <div className="">
                <input type="text"
                       ref={input => this.search = input}
                       onChange={this.filterArr}
                />
                {this.renderArr(this.state.arr)}
            </div>
        )
    }
}
READ ALSO
Почему HTML5 &lt;video&gt; autoplay на смартфонах не работает?

Почему HTML5 <video> autoplay на смартфонах не работает?

Хочу использовать тег <video> с параметром autoplay, но на смартфонах не работаетКроме того на JavaScript метод

247
Redirect неактивного окна. requestAnimation setIterval()

Redirect неактивного окна. requestAnimation setIterval()

Проблема заключается в том, что когда окно браузера находится в неактивном состоянии не делать переадресацию или если браузер поддерживает...

196
Почему trigger(&#39;click&#39;) не срабатывает на смартфонах, но отлично работает на ПК?

Почему trigger('click') не срабатывает на смартфонах, но отлично работает на ПК?

Мне нужно что бы при клике на какой то блок, сработал trigger('click') на другой классПочему этот код не работает в мобильных браузерах? https://jsfiddle

230