2016-06-01 5 views
0

сказать, что у вас есть рендер-компонент с именем Banner;как передать новую опору для визуализированного компонента

Возможно ли обновить опоры баннера без замены компонента? как, например, с помощью функции ниже

function changeText(component, text){ 
    // change text inside banner 
} 
changeText(banner, 'Goodbye') 

Очевидно, что в данном примере это было бы намного легче переинициализировать Баннер с новым текстом, но я хочу, чтобы баннер иметь анимацию, когда текст изменяется, но не тогда, когда он инициализируется

+1

Вы можете использовать [componentWillReceiveProps] (http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops), а затем [установить некоторое состояние] (https://medium.com/ response-tutorials/response-state-14a6d4f736f5 # .p9hfmhflf), чтобы указать, что анимация должна произойти. Очевидно, вам нужен механизм передачи новых компонентов в Banner. Вы можете для этого создать компонент упаковки, который опросает текст баннера или что-то еще, а затем устанавливает баннер 'word' prop. Реакция сделает все остальное. – ctrlplusb

+0

Ознакомьтесь с некоторыми учебниками. http://facebook.github.io/react/docs/tutorial.html – ctrlplusb

ответ

1

Ваш пример немного упрощен. Ваша фактическая проблема может быть несколько вещей, но я возьму удар по тому, что кажется наиболее вероятным.

Если цель состоит в том, чтобы содержимое вашего div было изменено, тогда ответ заключается не в том, чтобы использовать реквизиты вообще. Это именно то, для чего ваше государство!

var Banner = React.createClass({ 
    render: function() { 
     return <div>this.state.word</div> 
    }, 
    getInitialState: function(){ 
     return {word: this.props.word}; 
    } 

    changeWord: function(word){ 
     this.setState({word: word}); 
    } 
}); 

EDIT:

Если вы пытаетесь изменить компонент из ванили JS внедренный в другом месте на странице:

Я думаю, что вам лучше всего в этом случае было бы использовать некоторые (если не все) из Flux шаблона дизайна: https://facebook.github.io/flux/docs/overview.html#content

Если не весь Flux парадигмы, вы могли бы по крайней мере, использовать пути потока обрабатывает «Магазины», которые являются по существу только Node.js EventEmmiters: https://nodejs.org/api/events.html

var BannerStore = new EventEmmitter(); 

var Banner = React.createClass({ 
    render: function() { 
     return <div>this.state.word</div> 
    }, 
    getInitialState: function(){ 
     return {word: this.props.word}; 
    }, 
    changeWord: function(){ 
     this.setState({word: BannerStore.word}); 
    }, 

    componentDidMount: function(){ 
     BannerStore.on('banner_change', this.changeWord); 
    }, 

    componentWillUnmount: function(){ 
     BannerStore.removeListener('banner_change', this.changeWord); 
    } 
}); 

function changeText(component, text){ 
    if(component === 'banner'){ 
     BannerStore.word = text; 
     BannerStore.emit('banner_change'); 
    } 
} 
changeText(banner, 'Goodbye') 

Использование полной парадигмы потока будет более чистым в долгосрочной перспективе, но более чем можно разумно ввести в SO.

+0

Но это будет работать только в том случае, если «Баннер» «владеет» этими данными, чего, возможно, это не очень удобно. Вам нужно будет найти способ ввода этих данных в компонент без использования реквизита; любой способ, о котором я могу думать, кажется очень «un-React-y». –

+0

Итак, откуда взялись данные? Это похоже на суть вашего вопроса, но вы не указали нам на это! – gravityplanx

+0

Я не OP :-) В примере OP, похоже, он передает сообщение из реквизита. –

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