Функция вызывается после рендеринга, реагирующего на нативную

У меня есть функция загрузки, которая загружает мои данные в мой источник данных ListView, и, как вы, возможно, знаете, ListView не всегда будет повторно выполнять рендеринг с изменением состояния, и мне нужно принудительно обновить его, эта функция загрузки работает очень хорошо, вызывается кнопкой, но я хочу, чтобы она загружалась автоматически, но вызов forceupdate недоступен в функциях componentwill / did mount. Что я могу сделать? Я просто хочу, чтобы моя функция вызывалась с небольшой задержкой после рендеринга. проблема в том, что this.props.navigation не является объектом до рендеринга и не может использоваться при монтировании / монтировании компонента.

 //   UNSAFE_componentWillMount() {
//   this.makeScene();
// }

makeScene(){
var count = Object.keys(window.contents[this.props.navigation.getParam('name')]).length;
for(let i = 0 ; i < count ; i ++){
  global.subnum[i] = i;
  global.lowersubjects[i] = window.contents[this.props.navigation.getParam('name')][i].subject;
  global.lowerdescriptions[i] = window.contents[this.props.navigation.getParam('name')][i].description;
  global.lowerimageurl[i] = window.contents[this.props.navigation.getParam('name')][i].imageurl;
  global.author[i] = window.contents[this.props.navigation.getParam('name')][i].author;
  global.eventdate[i] = window.contents[this.props.navigation.getParam('name')][i].eventdate;
}
this.setState({
  subnum : global.subnum
});
this.forceUpdate();
}    

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


person Behnam Aminazad    schedule 29.07.2018    source источник


Ответы (1)


3 вещи:

Во-первых, в getParam отсутствует аргумент, который является значением по умолчанию, если указанное поле пусто или не существует:

var name = this.props.navigation.getParam('name', 'defaultName')

С именем вам не придется все время вызывать его, чтобы получить доступ к ячейке массива.

Во-вторых, что такое window.contents?

Наконец, каждый вызов this.setState () будет вызывать отображение представления, ЕСЛИ состояние или свойства вашего компонента изменились. Вы должны вызвать свою процедуру в componentDidMount(), и да, this.props.navigation должен быть доступен в componentDidMount(), поскольку ваш компонент находится в навигаторе, я полагаю ...

person Agterra    schedule 29.07.2018
comment
проблема с componentdidmount заключается в том, что он вызывается, когда мое приложение запускается, а не тогда, когда я перехожу на страницу, я хочу, чтобы она вызывалась при отображении страницы, потому что window.contents, которая является глобальной переменной, заполняется на предыдущей странице и я получаю undefined если это вызывается до того, как я перейду на страницу (я использую stacknavigator), и спасибо за ответ, кстати. - person Behnam Aminazad; 29.07.2018
comment
componentDidMount должен вызываться при монтировании компонента, а не при запуске приложения. Если ваш источник данных находится в состоянии, ваш ListView будет повторно визуализирован. Вы также можете попробовать вызвать this.makeScene() в конструкторе. Если вы попытаетесь использовать некоторые данные, которые вы генерируете в функции makeScene, вы можете получить сообщение об ошибке, если это не будет сделано до того, как ListView попытается отобразить их. - person howtopythonpls; 29.07.2018
comment
@howtopythonpls, я не знаю почему, но когда я использую stacknavigator, componentdidmount вызывается, когда я перехожу на первую страницу моего stacknavigator (без перехода на страницу, которую я назвал componentdidmount on), и я обнаружил, что у других людей тоже была эта проблема. но в любом случае спасибо, я мог бы просто исправить это с помощью вызова componentwillmount, который вызывается при запуске, и когда я перехожу на страницу и добавляю условие if, моя функция будет вызываться только тогда, когда window.content готов, а не пуст. - person Behnam Aminazad; 30.07.2018
comment
Хорошо, вы сделали console.log внутри вашего componentDidMount, чтобы подтвердить, что это так (потому что это странно)? У меня была аналогичная проблема, когда и конструктор, и componentDidMount вызывались, когда я покидал страницу, и мне приходилось исправлять это с условием, как и вы. - person howtopythonpls; 30.07.2018
comment
@BehnamAminazad Да, когда вы создаете навигатор, он монтирует все компоненты, которые он содержит, одновременно при рендеринге навигатора, это нормальное поведение. В вашем componentDidMount() или, что еще лучше, в вашем shouldComponentUpdate(nextProps, nextState), проверьте, есть ли у вас данные, которые вам нужны, или установите значение по умолчанию, которое не приведет к сбою вашего представления (не забывайте, что этот метод должен возвращать bool) - person Agterra; 30.07.2018