Как загрузить всю выборку из React перед загрузкой пользовательского javascript из отдельного файла

Я использую как реакцию, так и jquery отдельно. Я хочу, чтобы bundle.js реагировал на получение всех данных api перед запуском функций jquery.

У меня есть код реакции, загружающий все изображения с серверов / api и jquery, чтобы сдвинуть эти изображения и управлять высотой изображения в соответствии с экраном. Сначала я включил bundle.js, а затем свой файл custom.js. Несмотря на то, что bundle.js запускается первым, но api выборки запускается после custom.js, из-за чего jquery не может сдвинуть эти изображения.

App.js

export class App extends Component {

constructor(props){
    super(props)
    this.state = {
        loading : false,
        all_data : []
    }
    this.fetchFromServer();
}

fetchFromServer(){
    Promise.all([
        fetch("http://abcdef.com/api/slider.php",{
            method : "POST",
            headers: new Headers({
                'Accept' : 'application/json',
            }),
            body: JSON.stringify({
                limit : "10",
            })
        })
    ]).then(([all_post_api])=>Promise.all([all_post_api.json()])).
    then(([post_data]) => this.setState({
        loading : false,
        all_data : post_data
    }))
}

render(){
        const allowRender = this.state.all_data && this.state.all_data.carousel
        if (allowRender) {

        return (<div className = "right-content">

            <Main data = {this.state.all_data} />
        </div>)

        } 

        return null;
}

}

Main.js

export class Main extends Component {

render(){
    console.info(this.props.data.carousel);
    return (


                <div className = "flexslider home-page">
                    <ul className = "slides">
                    {
                        this.props.data.carousel.map((name,index)=>{
                            return (
                            <li className = "images-bg" key = {index}>
                                <img src = {name.url} />
                                <div className = "circle">
                                            <div className = "home-title left">
                                                <span>
                                                    Welcome <strong>to</strong>
                                                </span>
                                                <span>
                                                    <strong>foto</strong>hunter
                                                </span>
                                                <p>Only the best pictures of animals and travel.</p>
                                            </div>
                                            <a className = "button-down glyph fa-angle-down" href = ""></a>
                                        </div>
                            </li>
                            )

                        })

                    }
                    </ul>
                </div>




    )
}

}

custom.js

$(function (){        
 console.info("loaded content");
$('.images-bg').each(function(){
            $(this).css({
                'background-image': 'url(' +$('img', this).hide().attr('src') +')',
                'height': $(window).height()
            });
        });

        /*----------  BIG SLIDER  ----------*/
        $('.portfolio-with-details .flexslider, .service .flexslider').flexslider({slideshowSpeed: 5000});
        $('.portfolio-image.flexslider').flexslider({slideshow: false});
        $('.flexslider.home-page').flexslider({
            slideshowSpeed: 5000,
            after : function(slider){
                var next = $('.flex-active-slide', slider).find('.home-title');
                var className = '';
                if (next.hasClass('left')){
                    className = 'bounceInLeft';
                }else if (next.hasClass('top')){
                    className = 'flipInX';
                }else if (next.hasClass('zoom')){
                    className = 'bounceIn';
                }
                next.addClass(className + ' animated');
                next.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
                    next.removeClass(className + ' animated');
                });
            }
        });
        /*----------  //BIG SLIDER  ----------*/

    })

Ниже приведен снимок экрана, который я получаю сейчас. Хочу наоборот. Я ожидал, что сообщение custom.js console.info будет напечатано после Main.js console.info

Как загрузить всю выборку из React перед загрузкой пользовательского javascript из отдельного файла

Поведение ключевого слова "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
0
337
1

Ответы 1

В вашем JQuery попробуйте изменить его на

$( document ).ready(function (){        
 console.info("loaded content");
$('.images-bg').each(function(){
            $(this).css({
                'background-image': 'url(' +$('img', this).hide().attr('src') +')',
                'height': $(window).height()
            });
        });

        /*----------  BIG SLIDER  ----------*/
        $('.portfolio-with-details .flexslider, .service .flexslider').flexslider({slideshowSpeed: 5000});
        $('.portfolio-image.flexslider').flexslider({slideshow: false});
        $('.flexslider.home-page').flexslider({
            slideshowSpeed: 5000,
            after : function(slider){
                var next = $('.flex-active-slide', slider).find('.home-title');
                var className = '';
                if (next.hasClass('left')){
                    className = 'bounceInLeft';
                }else if (next.hasClass('top')){
                    className = 'flipInX';
                }else if (next.hasClass('zoom')){
                    className = 'bounceIn';
                }
                next.addClass(className + ' animated');
                next.one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function(){
                    next.removeClass(className + ' animated');
                });
            }
        });
        /*----------  //BIG SLIDER  ----------*/

    })

Таким образом, React извлекается перед монтированием, а JQuery запускается, когда страница полностью готова!

Даже использование componentWillMount приводит к тому же результату. Я хочу, чтобы "загруженный контент" печатался после {carousel: Array (3)}

whoknows 27.12.2018 15:59

Тем не менее, на вашем месте я бы попытался преобразовать ваш JQuery в React. Это приводит к меньшему количеству проблем. Надеюсь, это решение сработает, хотя

José Santos 27.12.2018 16:15

Я получил тот же результат даже с вышеуказанными изменениями. Однако при построении у меня было состояние загрузки false, но внутри componentWillMount я изменил загрузку на true, а затем использовал метод fetchFromServer (), результатом было Loading: true, {} Read! (из jquery) Загрузка: false, {Carousel: Array (3)} почему состояние all_data не изменилось?

whoknows 27.12.2018 16:23

попробуйте удалить componentwillmount и проверьте это для своего jquery stackoverflow.com/questions/9036969/…

José Santos 27.12.2018 16:37

Я пытаюсь преобразовать свой JQuery, чтобы он реагировал на данный момент. Посмотрим, работает это или нет

whoknows 27.12.2018 16:42

Так лучше, поверь мне. React имеет свои собственные методы жизненного цикла. Когда вы смешиваете его с JQuery, у вас могут быть очень плохие времена.

José Santos 27.12.2018 16:44

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