Как видно здесь Я стараюсь как можно больше отключить компоненты своего приложения и не сообщать им о каком-либо создателе хранилища или действия.
Цель состоит в том, чтобы заставить их управлять своим состоянием и функциями вызова, чтобы исправить изменения. Мне сказали, что вы делаете это с помощью реквизита.
Учитывая
// Menu.jsx
import React from 'react'
import { className } from './menu.scss'
import Search from 'components/search'
class Menu extends React.Component {
render () {
return (
<div className={className}>
<a href='#/'>Home</a>
<a href='#/foo'>foo</a>
<a href='#/bar'>bar</a>
<Search />
</div>
)
}
}
и
// Search.jsx
import React from 'react'
import { className } from './search.scss'
class Search extends React.Component {
render () {
let { searchTerm, onSearch } = this.props
return (
<div className={`search ${className}`}>
<p>{searchTerm}</p>
<input
type='search'
onChange={(e) => onSearch(e.target.value)}
value={searchTerm}
/>
</div>
)
}
}
Search.propTypes = {
searchTerm: React.PropTypes.string,
onSearch: React.PropTypes.function
}
export default Search
И читаю здесь Я вижу умное использование Provider
и connect
, и моя реализация будет выглядеть примерно так:
import { bindActionCreators, connect } from 'redux'
import actions from 'actions'
function mapStateToProps (state) {
return {
searchTerm: state.searchTerm
}
}
function mapDispatchToProps (dispatch) {
return bindActionCreators({
dispatchSearchAction: actions.search
}, dispatch)
}
export default connect(mapStateToProps, mapDispatchToProps)(Search)
Предполагая, что у меня есть обработка хранилища searchTerm
как часть глобального состояния.
Проблема в том, где этот код принадлежит? Если я поместил его в Search.jsx
, я буду сочетать действия с компонентом и более важным для redux
.
Я должен иметь две разные версии моего компонента, одну развязанную и одну connect()
ed и использовать <Menu />
для ее использования? Если да, то каким будет выглядеть дерево файлов? Один файл на один компонент или как make-all-connected.js
?