2016-09-22 22 views
8

Robię listę używając onsenui i reaguję. , ale nie mogę wywołać powiązania z numeru bieżącego.Nie można odczytać właściwości "bind" niezdefiniowanej. React.js

Nie mogłem wymyślić .... Czy ktoś może rozwiązać ten problem?

To jest mój kod. Chciałbym wywołać metodę handleechanged z elementu wejściowego. Ale wtedy nie można odczytać właściwości "bind" niezdefiniowanego jest podniesiona.

export default class MainPage extends React.Component { 
 

 

 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
     selectedValue: "myself", 
 
     destinations: ["myself","somebody"], 
 
     }; 
 
    } 
 

 

 
    handleChange(value) { 
 
    this.setState({selectedValue: value}); 
 
    } 
 

 
    renderRadioRow(row) { 
 
    return (
 
     <ListItem key={row} tappable> 
 
     <label className='left'> 
 
      <Input 
 
      inputId={`radio-${row}`} 
 
      checked={row === this.selectedValue} 
 
      onChange={this.handleChange.bind(this, row)} 
 
      type='radio' 
 
      /> 
 
     </label> 
 
     <label htmlFor={`radio-${row}`} className='center'> 
 
      {row} 
 
     </label> 
 
     </ListItem> 
 
    ) 
 
    } 
 

 
    render() { 
 
    return (
 
     <Page renderToolbar={this.renderToolbar}> 
 
     <p style={{textAlign: 'center'}}> 
 
      test 
 
     </p> 
 

 
     <List 
 
      dataSource={this.state.destinations} 
 
      renderRow={this.renderRadioRow} 
 
     /> 
 
     </Page> 
 
    ); 
 
    } 
 
}

+0

Fragmenty stosu (użyty przycisk paska narzędzi "<>") są dla ** możliwych do uruchomienia ** przykładów. Twój przykład nie jest możliwy do uruchomienia, więc powinien znajdować się w bloku kodu (przycisk '{}' na pasku narzędzi). Ale jeszcze lepiej byłoby * sprawić, * że będzie działał, ponieważ skrypty stosu obsługują ReactJS. –

+0

Może to być funkcja renderRadioRow, która tworzy nowy kontekst, którego "to" jest używane do powiązania onChange = {this.handleChange.bind (this, row)}. –

+0

Czy istnieje kanoniczna odpowiedź na pytanie "nie można odczytać X nieokreślonego"? Nadal widzę te pytania iw 99% przypadków jest to oczywiste - komunikat o błędzie mówi wszystko, co potrzebne. Uzyskujesz dostęp do X z pewnej zmiennej, która jest "niezdefiniowana". Sugerowany sposób działania - dowiedz się, dlaczego tak się stało i bądź mu przeszkadzać, lub nie uzyskuj dostępu do X. Dopasuj do swoich potrzeb. Reszta pytań dotyczy tego samego wydarzenia w bibliotece osób trzecich. W takim przypadku zwykle problemem jest nieprawidłowe korzystanie z niego.Sugerowany tok postępowania - znajdź, jeśli źle go skonfigurowałeś lub źle to rozumiesz. – vlaz

Odpowiedz

9

https://facebook.github.io/react/docs/reusable-components.html#no-autobinding

Nie autobindingu

Metod podążać tą samą semantykę jak regularne zajęcia ES6, co oznacza, że ​​nie wiąże się to automatycznie na przykład. Musisz jawnie użyć .bind(this) lub strzałek funkcji =>:

Można użyć bind(), aby zachować this

<div onClick={this.tick.bind(this)}> 

Albo można użyć funkcji strzałek

<div onClick={() => this.tick()}> 

Zaleca się wiązać twoje programy obsługi zdarzeń w konstruktorze, więc są związane tylko raz dla każdego wystąpienia:

constructor(props) { 
    super(props); 
    this.state = {count: props.initialCount}; 
    this.tick = this.tick.bind(this); 
} 

Teraz można użyć this.tick bezpośrednio, jak został on zobowiązany raz w konstruktorze:

jest już związana w konstruktorze

<div onClick={this.tick}>

To jest lepsze dla wykonywania aplikacji, zwłaszcza jeśli implementuj metodę shouldComponentUpdate() z płytkim porównaniem w komponentach potomnych.

export default class MainPage extends React.Component { 
 

 

 
    constructor(props) { 
 
     super(props); 
 
     this.state = { 
 
     selectedValue: "myself", 
 
     destinations: ["myself","somebody"], 
 
     }; 
 
     this.renderRadioRow = this.renderRadioRow.bind(this); 
 
    } 
 

 

 
    handleChange(value) { 
 
    this.setState({selectedValue: value}); 
 
    } 
 

 
    renderRadioRow(row) { 
 
    return (
 
     <ListItem key={row} tappable> 
 
     <label className='left'> 
 
      <Input 
 
      inputId={`radio-${row}`} 
 
      checked={row === this.selectedValue} 
 
      onChange={() => { 
 
       this.handleChange(row); 
 
      } 
 
      type='radio' 
 
      /> 
 
     </label> 
 
     <label htmlFor={`radio-${row}`} className='center'> 
 
      {row} 
 
     </label> 
 
     </ListItem> 
 
    ) 
 
    } 
 

 
    render() { 
 
    return (
 
     <Page renderToolbar={this.renderToolbar}> 
 
     <p style={{textAlign: 'center'}}> 
 
      test 
 
     </p> 
 

 
     <List 
 
      dataSource={this.state.destinations} 
 
      renderRow={this.renderRadioRow} 
 
     /> 
 
     </Page> 
 
    ); 
 
    } 
 
}

+0

Muszę wywołać tę funkcję z wartością wiersza, czy mogę dodać niektóre wartości do tej funkcji? –

+0

Następnie użyj funkcji strzałki 'onChange = {() => handleChange (wiersz)}' – Lottamus

+0

Próbowałem '() => handleChange (row)' i '() => this.handleChange (row)'. Ale oba podniosły niezdefiniowany błąd handleChange ... –

0

nie wiem jakie wartości są przekazywane w rzędzie, ale trzeba przekazać kontekst renderowania w celu wywołania tej funkcji i wiązania.

export default class MainPage extends React.Component { 


    constructor(props) { 
     super(props); 
     this.state = { 
      selectedValue: "myself", 
      destinations: ["myself","somebody"], 
     }; 
    } 


    handleChange(value) { 
     this.setState({selectedValue: value}); 
    } 

    renderRadioRow(row,renderContext) { 
     return (
      <ListItem key={row} tappable> 
       <label className='left'> 
        <Input 
         inputId={`radio-${row}`} 
         checked={row === this.selectedValue} 
         onChange={this.handleChange.bind(renderContext, row)} 
         type='radio' 
        /> 
       </label> 
       <label htmlFor={`radio-${row}`} className='center'> 
        {row} 
       </label> 
      </ListItem> 
     ) 
    } 

    render() { 
     var renderContext=this; 
     return (
      <Page renderToolbar={this.renderToolbar}> 
       <p style={{textAlign: 'center'}}> 
        test 
       </p> 

       <List 
        dataSource={this.state.destinations} 
        renderRow={() => this.renderRadioRow(row,renderContext)} 
       /> 
      </Page> 
     ); 
    } 
} 
Powiązane problemy