2016-07-20 2 views
0

это 1-й компонент как index.jsxФильтр поиска не работает в React.js

это массив, который содержит все данные.

let details=[{ 
    id:'1', 
    website: 'amazon', 
    username:'harry', 
    password: '1234' 
    }, 
{ 
    id:'2', 
website: 'flipkart', 
username:'nowag', 
password: 'gfjh' 
}, 
{ 
    id:'3', 
website: 'skype', 
username:'king', 
password: 'yesyes' 

}, 
{ 
    id:'4', 
website: 'facebook', 
username:'deep', 
password: 'hellohello' 

    }]; 

класс приложение начинается здесь

class App extends React.Component{ 

constructor(props) { 
    super(props); 
    this.state= { 
     filter: null 
    }; 
} 

setFilter(filter) { 
    this.setState({filter: filter}) 
    } 

     render(){ 

ошибка здесь, что "Не удается прочитать свойство 'фильтр' неопределенных"

 let filteredPassword = this.props.details.filter(
      (detail) =>{ 
       return detail.website.toLowerCase().indexOf(this.state.search)!= -1; 
      } 
    ); 

     return (

     <ul> 
      <Filter onUpdateFilter={this.setFilter} /> 
      { 
       filteredPassword.map((detail)=>{ 
       return <Detail item={detail} key={detail.id} /> 
      })} 

     </ul> 

     ) 
     } 
    } 



     export default App; 

теперь есть еще один компонент filter.jsx

class Filter extends React.Component{ 

    constructor(props) { 
    super(); 
    this.state= { 
     search:'Search' 
    }; 
    } 



    updateSearch(event) { 
     this.setState({search: event.target.value.substr(0,40)}); 
     //this.props.onUpdateFilter(event.target.value.substr(0,40)) 
    } 

    render() { 

    return (
     <div> 
      <input type="text" defaultValue={this.state.search} onchange={this.updateSearch.bind(this)}/> 
     </div> 
    ) 
    } 
    } 

это w ау, который я пытался запустить свой фильтр, но он не работает

+0

Первое, что я вижу в том, что государство всегда должно управляться из родительского компонента. Детальные компоненты должны быть немыми и не иметь состояния – erichardson30

+0

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

+0

У вас есть 2 компонента, приложение и фильтр. Фильтр является дочерним элементом приложения, поэтому фильтр не должен иметь свое собственное состояние. Приложение должно содержать состояние как для себя, так и для всех его детей и передавать состояние детям в качестве реквизита. Государство не должно обновляться/мутироваться у детей и должно выполняться только в родителе. – erichardson30

ответ

1

Это то, что ваш код должен выглядеть следующим образом:

class App extends React.Component{ 

constructor(props) { 
    super(props); 
    this.state= { 
     filter: null 
    }; 
    this.setFilter = this.setFilter.bind(this); 
} 

setFilter(filter) { 
    this.setState({filter: filter}) 
    } 

     render(){ 
     let filteredPassword = this.props.details.filter(
      (detail) =>{ 
       return detail.website.toLowerCase().indexOf(this.state.search)!= -1; 
      } 
    ); 

     return (

     <ul> 
      <Filter onUpdateFilter={this.setFilter} /> 
      { 
       filteredPassword.map((detail)=>{ 
       return <Detail item={detail} key={detail.id} /> 
      })} 

     </ul> 

     ) 
     } 
    } 



     export default App; 


class Filter extends React.Component{ 

    constructor(props) { 
    super(props); 
    } 

    updateSearch(event) { 
     this.props.onUpdateFilter(event.target.value.substr(0,40)) 
    } 

    render() { 

    return (
     <div> 
      <input type="text" defaultValue="Search" onchange={this.updateSearch.bind(this)}/> 
     </div> 
    ) 
    } 
    } 
+0

это дает мне еще ту же ошибку Index.jsx? 5537: 47 Uncaught TypeError: Не могу прочитать свойство 'filter' undefined –

+0

Если вы поместите контрольную точку в функцию updateSearch и посмотрите, что такое 'event.target.value.substr (0 , 40) 'и другую точку останова в setFilter и посмотреть, что содержит' filter', что вы получаете? – erichardson30

+0

Можете ли вы рассказать мне, как поставить точку останова. Я новичок в реакции.js –

1

Если вы не сдадите details к компоненту, вам нужно заменить this.props.details на details


И заменить это, потому что setFilter имеет неправильный контекст

<Filter onUpdateFilter={this.setFilter} /> 

к этому:

<Filter onUpdateFilter={filter => this.setFilter(filter)} /> 

или связываются в конструкторе:

constructor(props) { 
    super(props); 
    this.state= { 
     filter: null 
    }; 

    this.setFilter = this.setFilter.bind(this) 
} 
+0

она дает такую ​​же ошибку ... ничего не изменилось –

+0

это работает ... я передал детали компоненту. как я писал выше. https://jsfiddle.net/69z2wepo/49731/ –

+0

Вы там, мне нужна ваша помощь? –

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