поиск / фильтрация списка с помощью реакции / редукса - PullRequest
0 голосов
/ 27 августа 2018

В настоящее время я учусь реагировать, сокращаться и сталкиваюсь с проблемой, с которой не могу разобраться.Попытка реализовать ту же функциональность, что и в этой статье: https://medium.com/@yaoxiao1222/implementing-search-filter-a-list-on-redux-react-bb5de8d0a3ad, но, несмотря на то, что запрос данных от остальных API, с которыми я работаю, выполнен успешно, я не могу назначить локальное состояние в моем компоненте моему избыточному состоянию, чтобы иметь возможность отфильтровать мои результаты.Вот мой компонент:

import React from 'react'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import * as fetchActions from '../../actions/fetchActions'
import Stafflist from './Stafflist'

class AboutPage extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      search: '',
      currentlyDisplayed: this.props.store.posts
    }
    this.updateSearch = this.updateSearch.bind(this)
  }
  updateSearch(event) {
    let newlyDisplayed = this.state.currentlyDisplayed.filter(
      (post) => { 
        return (
          post.name.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1
          || post.role.toLowerCase().indexOf(this.state.search.toLowerCase()) !== -1
        )}
    )
    console.log(newlyDisplayed)
    this.setState({
      search: event.target.value.substr(0, 20),
      currentlyDisplayed: newlyDisplayed
    })
  }
  render() {
     return (
      <div className="about-page">
        <h1>About</h1>
        <input type="text"
          value={this.state.search}
          onChange={this.updateSearch}
        />
        //component for rendering my list of posts.
        <Stafflist posts={this.state.currentlyDisplayed} />
      </div>
     )
  }
}
// this is here i assign my api data to this.props.store.posts
function mapStateToProps(state, ownProps) {
  return {
    store: state
  }
}

function mapDispatchToProps(dispatch) {
  return {
    actions: bindActionCreators(fetchActions, dispatch)
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(AboutPage)

Сравнение того, как я назначаю состояние своих хранилищ локальному компоненту с тем, как оно работает в статье, похоже, делается так же.Моя:

this.state = {
   search: '',
   currentlyDisplayed: this.props.store.posts
}

статья:

this.state = {
   searchTerm: '',
   currentlyDisplayed: this.props.people
}

в реагирующих устройствах. Я могу видеть мои данные в том виде, в каком они должны быть в хранилище, но назначить их моим не получитсялокальное состояние внутри компонента, чтобы выполнить фильтрацию, и я не знаю, как отладить это.Мое состояние в локальном компоненте просто говорит

 State
 currentlyDisplayed: Array[0]
 Empty array

также, если я изменю

<Stafflist posts={this.state.currentlyDisplayed} /> 

на

<Stafflist posts={this.props.store.posts} /> 

, список будет отображаться так, как должен:)

Редуктор:

 import * as types from '../actions/actionTypes'
 import initialState from './initialState'


 export default function postReducer(state = initialState.posts, action) {
   switch(action.type) {
   case types.FETCH_POSTS_SUCCESS:
     return action.posts.data.map(post => {
       return {
         id: post.id,
         name: post.acf.name,
         role: post.acf.role
       }
     })     
   default:
     return state
   }
 }

Есть идеи?

1 Ответ

0 голосов
/ 29 августа 2018

Проблема с вашим кодом заключается в том, что вы не решаете, как получить вновь полученные реквизиты в вашем штате. Это означает, что при получении данных от вашего вызова API обновляются только реквизиты, а состояние компонента - нет.

Если вы внимательно посмотрите на ссылочную статью, в методе onInputChange они пересчитывают состояние из реквизита, тогда как ваш метод updateState фильтрует только локальное состояние.

Установка состояния в конструкторе гарантирует, что реквизиты будут скопированы при первоначальном монтировании компонента. В этот момент хранилище содержит только начальное состояние (initialState.posts в вашем коде редуктора). Это цена сохранения состояния компонента и магазина; Вы должны подумать о том, как синхронизировать их после начальной загрузки.

Одним из решений является обновление состояния в componentWillReceiveProps:

componentWillReceiveProps(nextProps){
  const nextFiltered = nextProps.store.posts.filter(your filtering code here);
  this.setState({currentlyDisplayed: nextFiltered});
}

Это обновит ваше состояние всякий раз, когда компонент получает новые реквизиты. Примечание. Реакция прекратила работу компонента componentWillReceiveProps, и вы должны использовать getDerivedStateToProps с момента реакции 16.3. Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...