2017-02-18 3 views
0

Я хотел бы попросить ваше мнение об этом. В принципе, я хочу сейчас обновить список компонентов после удаления элемента в списках объектов. В настоящее время я могу успешно удалить элемент через функцию deleteHeroes(list,index), но мой компонент не освежает вообще, чтобы отразить удаленный элемент. Можете ли вы рассказать о том, как я могу это сделать? вот мой код ниже:Обновить компонент после удаления объекта - ReactJS

componentDidMount(){ 
    // Fetch lists of heroes 
    this.props.getAllHeroes(); 
} 

renderHeroesList(){ 
    var listData = this.props.heroes.map((heroes,index) => (
     <HeroesListComponent key={heroes.id} heroes={heroes} onDelete = {() => this.deleteHeroes(heroes,index)} /> 
    )); 

    return listData; 
} 

// Remove item on heroes list 
deleteHeroes(list,index){ 
    const heroesProps = this.props.heroes; 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
} 

render(){ 

    return(
     { this.renderHeroesList() } 
    ); 


function mapStateToProps(state){ 
    return { 
     heroes: state.heroes.data 
    } 
}} 
function mapDispatchToProps(dispatch){ 
    return bindActionCreators ({ 
     getAllHeroes: getAllHeroes, 
     deleteHero: deleteHero, 
    }, dispatch); 
} 

ответ

0

Потому что вы ничего не сообщили о ваших изменениях.

Вы должны направить действие после deleteHeroes, что-то вроде этого

deleteHeroes(list,index){ 
    const { heroesProps, dispatch }= this.props; 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
    dispatch({type: 'SAVE_HEROES', heroes: heroesProps}); 
} 

// and somewhere in reducer 
case SAVE_HEROES: 
    return {...state, heroes: action.heroes} 

и написать соответствующую функцию редуктора. Но пусть компонент delete hereos (alter state), вы нарушили идею сокращения.

Вместо этого компонент не должен напрямую изменять героев, вы отправляете действие типа DELETE_HEROES и даете редуктору все остальное.

+0

Я следовать вашей инструкции, направить действие после deleteHeroes(), но я weirded почему метод рендеринга не срабатывает, хотя редукция изменяет состояние списков героев. –

0

У вас есть 2 основных варианты для рассмотрения:

  1. поместить данные (состояние) к общему общему предку, то есть стандартная стратегия от реакции: https://facebook.github.io/react/docs/lifting-state-up.html

  2. поставить все государство Redux (https://github.com/reactjs/react-redux), затем подключите ваш компонент и дисплей в зависимости от состояния redux. этот случай, у не должны делать ничего после удаления, Redux рамках будет заботиться о потоке данных и пользовательский интерфейс обновления

+0

Я сейчас делаю номер два, но то, что я столкнулся с проблемой сейчас, даже если изменение состояния, метод визуализации не стреляет –

1

У вас есть побочный эффект, который следует избегать любой ценой. В вашем случае это то, что вы мутируете внутреннюю ссылку heroes реквизита. Настолько типичный план, чтобы избежать этой проблемы - клонировать реквизит, а затем отправить новое действие с новыми данными реквизита. Так что ваш код должен выглядеть следующим образом:

deleteHeroes(list,index){ 
    const clonedHeroesProps = this.props.heroes.slice(0); // clone the array 
    heroesProps.splice(heroesProps.indexOf(index), 1); 
    dispatch({type: 'SAVE_HEROES', heroes: clonedHeroesProps}); 
} 

Чем лучше, более Reactish способом было бы с помощью Immutability Helpers:

deleteHeroes(list,index){ 
    const clonedHeroesProps = update(heroesProps, {$splice: [[heroesProps.indexOf(index), 1]]}); 
    dispatch({type: 'SAVE_HEROES', heroes: clonedHeroesProps}); 
} 
+0

Да, я уже делаю это и успешно отправляю, что дает мне обновленные герои. Моя проблема теперь в том, что мой компонент не реагирует после того, как я получил обновленные списки героев –

+0

, вы можете попробовать отладить это с помощью метода 'componentWillReceiveProps (nextProps)', проверьте, если вы получаете новые реквизиты. Также проверьте с помощью инструментов React dev, что происходит с реквизитом и состоянием в течение всего этого процесса. – Shota

+0

componentWillReceiveProps не запускается, но когда я включаю журнал внутри renderHeroesList(), я вижу, что this.props.heroes изменяется на основе элемента, который я удалил с помощью deleteHeroes. Но все же метод рендеринга не срабатывает, даже если renderHeroesList() изменился. –

Смежные вопросы