Мой компонент React не обновляется в браузере Safari

Думал, все идет отлично. Отлично работает в Chrome, FF, Edge и даже в IE 11!

Родительский компонент содержит все состояние. Я передаю объект ставок дочернему компоненту, который вычисляет количество для передачи дочернему компоненту для отображения.

Родительское состояние «ставки» — это объект с ключами в качестве идентификатора и значением в качестве объекта.

Родительское состояние правильно меняется, когда я взаимодействую с приложением. Почему только Safari не будет обновляться при изменении родительского состояния? (на iOS и MacOS)

Родитель

class ParentComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            bets: {}
        };
    }
}

Ребенок

getBadgeCount = (league) => {
    const bets = this.props.bets;
    let count = 0;
    Object.keys(bets).map((bet) => bets[bet].event.league === league && count++);
    return count;
};

// ...

<ChildItem count = {this.getBadgeCount(league)} />

ГрандЧайлд

class GrandChildComponent extends React.Component {
    render() {
        const { count } = this.props;
        return (
            <div>
                <div>
                    {count > 0 && <div>{count}</div>}
                </div>
            </div>
        );
    }
}

Я console.info подсчитал внутри рендеринга внука и в компонентеDidUpdate, и он показывает правильное число. Есть ли что-то конкретное для Apple/Safari с реакцией, которую мне не хватает?

Ваш код выглядит нормально. Как вы обновляете состояние в ParentComponent? Вы используете this.setState или что-то другое?

mshindal 05.03.2019 18:27

Да, я использую this.setState({ bets: currentBets }) внутри обработчика кликов

Taylor A. Leach 05.03.2019 19:06
Поведение ключевого слова "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) для оценки ваших знаний,...
5
2
10 352
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Итак, я решил очень странную проблему через несколько дней.

Происходило следующее: я предполагаю, что движок в браузере Safari неправильно перерисовывал маленький значок значка. Я бы распечатал значение внутри DOM, СНАРУЖИ стилизованного значка, который я использовал, и число обновилось бы, как и ожидалось... Это заставило меня поверить, что проблема связана со стилями.

ТОГДА после удаления того, что, как я думал, было причиной проблемы с CSS, я заметил, что сафари «частично» обновляло значение в значке. Похоже, что он наполовину перерендерился, и предыдущее число сталкивается с новым значением... Не уверен, что это какая-то неясная проблема с механизмом рендеринга?

После добавления и удаления всех CSS один за другим проблема осталась, поэтому я решил обмануть браузер, чтобы он «принудительно» рендерил с помощью простого вычисления внутри дочернего элемента, где он рендерился:

const safariRenderHack = { opacity: count % 2 ? 1 : 0.99 };

<div style = {safariRenderHack}>{count}</div>

Не лучшее решение, но да ладно, я думаю, это исправлено. га

В случае, когда есть изменяемые переменные, на основе которых вы можете переключаться между стилями (непрозрачность: 1 или непрозрачность: 0,99), вы можете попробовать добавить ключ к элементу, который не обновляется в Safari/iOS.

<div key = {new Date()} className = {'myComponent'}>{Count}</div>

Я столкнулся с той же проблемой, пока это работает.

Я просто столкнулся с подобной проблемой. Safari не перерисовывал некоторые тексты, реализованные как:

<span>{someValue}</span>

При обновлении поля «someValue» reactJS работал нормально (элемент был запрошен для рендеринга), но Safari повторно рендерит только область нового значения (короче, чем предыдущая). Глюки пользовательского интерфейса :-/

Если я что-то делал с CSS с помощью инструментов разработчика, элемент снова отображался и выглядел нормально :-/

После некоторых попыток я, к счастью, использовал свойство стиля 'отображение: блок;', и он начал перерисовываться абсолютно нормально. Также 'отображение: встроенный блок;' решит и эту проблему, если это необходимо.

это может помочь вам:

будет изменяться: трансформироваться;

вопрос был задан полтора года назад

Tarukami 17.09.2020 12:18

@Lukianchuk Максим Если вы считаете, что на этот 18-месячный вопрос нужен лучший ответ (что само по себе совершенно нормально), объясните, что именно и почему вы предлагаете этот код. Возможно, вы захотите прочитать этот stackoverflow.com/help/how-to-answer

Johan Faerch 17.09.2020 12:39

У меня была аналогичная проблема, когда диапазон, расположенный по центру, с использованием flexbox внутри div, не обновлялся правильно в Safari.

Рестайлинг этого div для использования display:block решил эту проблему с рендерингом, так что, возможно, стоит обратить на это внимание, если кто-то столкнется с той же проблемой в будущем.

P.S. Глядя на код стиля сейчас, внесение изменений было на самом деле более чистым решением, поскольку оно уменьшило количество строк с 4 до 1, но, конечно, это может быть не во всех сценариях.

до:

display: flex;
flex-direction: row;
justify-content: center;
align-items: center;

after: (это div, поэтому display:block уже используется)

text-align: center;

При использовании функции картаРеагировать просматривает ключи:
Чтобы определить, какие элементы были изменены, добавлены или удалены.

Решение :

  • Сейчас, Поскольку вы используете функцию карты, вы должны использовать Добавить ключ для div внутри карты.
  • Использовать ключевая переменная, связанная с логикой щелчка, так что при нажатии клавиши переменная обновляется, и React перерисовывает этот дочерний элемент div. В виде следующего кода:
    <div key = {Count} className = {'myComponent'}>{Count}</div>

PS: я не рекомендую использовать Date в качестве ключа, потому что если вы быстро щелкаете, он дает сбои, а если вы соединяете его с состоянием с логикой, лежащей в основе щелчка, этого не произойдет.

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