2016-10-22 2 views
5

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

render(){ 

    let items = [{title:'hello'}, {title:'world'}]; 
    let component = false; 

    switch (id) { 
     case 1: 
     component = <A /> 
     break; 
     case 2: 
     component = <B /> 
     break;  
    } 

    return(
     items.map((item, index)=>{ 
     return(
      <span> 
      {/* SOMETHING LIKE THIS WOULD BE COOL - IS THAT EVEN POSSIBLE*/} 
      {component.props.set('title', item.title)} 
      </span>11 

     ) 
     }) 
    ) 
    } 

Внутри return Я бег цикла, где мне нужно установить подпорки для компонента, который хранится внутри переменной .... Как настроить реквизиты для этого компонента, который я сохранил ранее в переменной?

+0

вы не можете изменить состояние или проп во время визуализации, вы можете использовать componentDidUpdate или componentWillReceiveProps для него – abhirathore2006

+0

Клонирование компонента здесь плохой вариант, потому что это будет влиять на производительность, создавая дополнительные память для клонированных компонентов. И после клонирования исходные компоненты становятся бесполезными. Опять же, это плохой способ реализации. –

ответ

0

Вы можете переместить switch внутри map(). Надеюсь это поможет!

class A extends React.Component{ 
 
    render(){ 
 
    return <h1>Inside Component A:{this.props.title}</h1> 
 
    } 
 
} 
 

 
class B extends React.Component{ 
 
    render(){ 
 
    return <h1>Inside Component B: {this.props.title}</h1> 
 
    } 
 
} 
 

 
class Parent extends React.Component{ 
 
    render(){ 
 
     let items = [{title:'hello'}, {title:'world'}]; 
 
     const finalItems = items.map((item, index) => { 
 
     switch (parseInt(this.props.id)) { 
 
      case 1: 
 
      return <A title={item.title}/> 
 
      case 2: 
 
      return <B title={item.title}/>  
 
     } 
 
     }) 
 

 
     return(
 
     <span> {finalItems} </span> 
 
    ) 
 
    } 
 
} 
 
ReactDOM.render(<div> 
 
        <Parent id="1"/> 
 
        <Parent id="2"/> 
 
        <Parent id="3"/> 
 
       </div>, 
 
    document.getElementById('app'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 
<div id="app"></div>

Вам не нужно, чтобы добавить default случай как React будет игнорировать undefined, который будет возвращен в map, когда дело переключатель выходит из строя.

+1

Переключение по id не связано с контуром элементов, поэтому его следует вызывать снаружи. Вы выполняете одну и ту же операцию в каждом цикле, и эта операция должна выполняться только один раз. Этот код дает плохую производительность, и это плохая практика. –

+0

@MaciejSikora Добавлен рабочий пример. Надеюсь, это прояснит! –

0

Это можно сделать, если назначить не jsx, а ссылку на компонент, а затем использовать jsx в цикле с использованием компонента из переменной. Проверьте мои изменения кода.

render(){ 

let items = [{title:'hello'}, {title:'world'}]; 
let C = null; //null is more accurate for object variable 

switch (id) { 
    case 1: 
    C = A; //it is component reference, C must be from upper letter 
    break; 
    case 2: 
    C = B; //it is component reference 
    break; 
    default: 
    C = A; //good to have default for wrong ids  
} 

return(
    items.map((item, index)=>{ 
    return(
     <span> 
     <C {...item} /> //render component with props 
     </span>11 

    ) 
    }) 
) 
} 

Самые важные вещи:

1. C=A; мы устанавливаем на ссылку на переменную C для целевого компонента

2. <C {...item} /> все свойства из объекта элемента будет установлено в детской компоненте.

3.It можно использовать стандартный образ, как: <C title={item.title} />

Некоторого рабочего пример: https://jsfiddle.net/maciejsikora/jtt91wL3/3/

+0

Когда 'C' становится' null', поскольку я не вижу случая 'default' в' switch' для обработки этого случая, React выдает ошибку. Можешь попробовать! –

+0

@PraneshRavi очень смешно, и где вы видите значение по умолчанию для false? И что отреагировали на стандартную инструкцию switch? Да, попробуйте сами! Вопрос состоял в том, как настроить реквизиты динамического назначенного компонента, а не по умолчанию в коммутаторе. –

+0

Ваш код не будет работать, если 'id' равен 3. LOL. –

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