React TypeError: _this2.props.variations.find не является функцией

Не знаю, почему я получаю эту ошибку. Мне нужно перебрать варианты и найти идентификатор, содержащий переменные varid. Мне это кажется правильным, но, очевидно, это не так. Я уверен, что все здесь намного умнее меня, хотя, ха-ха, я все еще новичок во всем этом.

Эта функция должна позволить мне отфильтровать состояние, чтобы у меня были только необходимые данные и я мог отображать их на странице, а не состояние, содержащее все мои продукты drupal. Возможно, есть более эффективный способ сделать это, я не уверен.

Вот код:

class ProductPage extends Component {
    constructor(props) {
        super(props);

        this.toggle = this.toggle.bind(this);
        this.state = {
            dropdownOpen: false
        };
    }

    toggle() {
        this.setState(prevState => ({
            dropdownOpen: !prevState.dropdownOpen
        }));
    }

    render() {
        let style = {
            height: this.props.height - 56,
        };

        let product = this.props.products.items.find(o => o.path[0].alias === this.props.router.match.url);
        console.info(product);
        console.info(this.props.variations);

        let variationList = [];

        if (product && this.props.variations) {
            for (let i = 0; i < product.variations.length; i++) {
                let varid = product.variations[i].variation_id;
                let variation = this.props.variations.find(o => o.path[0].alias === varid);
                variationList.push(variation);
            }
        }

        let body = product && product.body.length ? product.body[0].value : null;

        return (
            <div className = "App" id = "default">
                <div className='MenuBar'>
                    <MenuBar/>
                </div>
                <div>
                    <div style = {style} className = "ProductPage row no-gutters">
                        <div className = "col-xs-3 col-md-3">
                            <LeftMenuBar/>
                        </div>
                        <div className = "outer col-xs-4 col-md-4">
                            <div>
                                <div id = "ProductPlacement">
                                  <img src = {WomensWear} alt = ""/>
                                    <div id = "alternate-pics">
                                        <div id = "alt-pic">
                                        </div>
                                        <div id = "alt-pic">
                                        </div>
                                        <div id = "alt-pic">
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div className = "col-xs-5 col-md-5">
                            <div id = "ImagePlacement">
                                <div className = "ProductTitle">
                                    <h1>First Product</h1>
                                </div>
                                <hr/>
                                <div className = "ProductDescription">
                                    <div dangerouslySetInnerHTML = {{__html: body}} />
                                </div>
                                <div id = "options">
                                    <div id = "color">
                                    </div>
                                    <div id = "color2">
                                    </div>
                                    <div id = "color3">
                                    </div>
                                </div>
                                <div id = "options">
                                    <div>
                                        <Dropdown isOpen = {this.state.dropdownOpen} toggle = {this.toggle}>
                                            <DropdownToggle caret id = "size-dropdown">
                                                Size
                                            </DropdownToggle>
                                            <DropdownMenu>
                                                <DropdownItem>1</DropdownItem>
                                                <DropdownItem>3</DropdownItem>
                                                <DropdownItem>5</DropdownItem>
                                            </DropdownMenu>
                                        </Dropdown>
                                        <div className = "AddToCart">
                                            <button className = "AddToCart">Add To Cart</button>
                                            <button className = "Price">$34.99</button>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        );
    }
}

    export default ProductPage;

что в результате console.info(this.props.variations);

Jake Haller-Roby 14.11.2018 03:54

Трудно сказать, но, возможно, вы передаете props что-то, что не является списком, null или undefined в variations

boaz_shuster 14.11.2018 05:03

Результат console.info (this.props.variations); дает мне все варианты всех трех моих продуктов. Итак, в основном я получаю массив из 9 элементов, на что я и надеялся. Но теперь, когда я выбираю конкретный продукт, я хотел бы отфильтровать это состояние только до вариаций для выбранного продукта.

Morgan Caldbeck 14.11.2018 05:13

Скорее всего это не массив. Докажите это, выйдя из системы - console.info(this.props.variations instanceof Array)

Julius 14.11.2018 06:53

там написано array [9], разверните его, и вы увидите все варианты.

Morgan Caldbeck 14.11.2018 19:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я также столкнулся с этой проблемой и методом проб и ошибок обнаружил, что это из-за копирования + вставки. Проверьте свой редуктор (-ы), чтобы убедиться, что вы не устанавливаете значение по умолчанию для объекта {} или другого типа вместо массива [].

В моем случае у меня было (кстати, это синтаксис ES6):

const someReducer = (state = {}, action) => {
    switch (action.type) {
        case 'reducer type':
            // get the data etc.
            return [];
        default:
            return state;
    }
};

Когда я должен был иметь:

const someReducer = (state = [], action) => {
    switch (action.type) {
        case 'reducer type':
            // get the data etc.
            return [];
        default:
            return state;
    }
};

Обратите внимание на первую строку, в которой я устанавливаю значение по умолчанию. Это используется, пока вызовы api ожидают выполнения, поэтому, если просто случается достигает кода, в котором используется .find(), вы получите сообщение об ошибке.

Это очень легко пропустить, потому что данные извлекаются так быстро, что вы не можете легко увидеть, когда данные относятся к неправильному типу. Просто убедитесь, что вы устанавливаете правильный тип по умолчанию! Надеюсь, это кому-то поможет!

Другие вопросы по теме