Думал, все идет отлично. Отлично работает в 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 с реакцией, которую мне не хватает?
Да, я использую this.setState({ bets: currentBets }) внутри обработчика кликов



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, я решил очень странную проблему через несколько дней.
Происходило следующее: я предполагаю, что движок в браузере 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 с помощью инструментов разработчика, элемент снова отображался и выглядел нормально :-/
После некоторых попыток я, к счастью, использовал свойство стиля 'отображение: блок;', и он начал перерисовываться абсолютно нормально. Также 'отображение: встроенный блок;' решит и эту проблему, если это необходимо.
это может помочь вам:
будет изменяться: трансформироваться;
вопрос был задан полтора года назад
@Lukianchuk Максим Если вы считаете, что на этот 18-месячный вопрос нужен лучший ответ (что само по себе совершенно нормально), объясните, что именно и почему вы предлагаете этот код. Возможно, вы захотите прочитать этот stackoverflow.com/help/how-to-answer
У меня была аналогичная проблема, когда диапазон, расположенный по центру, с использованием 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 key = {Count} className = {'myComponent'}>{Count}</div>PS: я не рекомендую использовать Date в качестве ключа, потому что если вы быстро щелкаете, он дает сбои, а если вы соединяете его с состоянием с логикой, лежащей в основе щелчка, этого не произойдет.
Ваш код выглядит нормально. Как вы обновляете состояние в
ParentComponent? Вы используетеthis.setStateили что-то другое?