gpt4 book ai didi

javascript - React - 在 sibling 之间传递状态?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:13:03 27 4
gpt4 key购买 nike

React 基本上是新手,我对如何在组件之间正确传递状态有些困惑。我已经找到了类似的问题React – the right way to pass form element state to sibling/parent elements?但我想知道您是否可以针对下面的代码给我一个具体的答案。

目前应用的结构包括:

  • 父组件 - App
  • 2 个子项:SearchBarRecipesList

目标是对我的 Meteor 集合进行异步搜索,并仅显示与搜索词匹配的食谱

现在,我只是展示我的 Meteor 系列中的所有食谱。我创建了一个名为 SearchBar 的有状态组件,它将输入值保存为 this.state.term。我的想法是将状态传递给 RecipesList 但我不确定这样做是否正确。或者,我会让 App 处理状态并将其传递给 child 。我相信这是一个很常见的场景,你是怎么做到的?

应用

class App extends Component {

render( ) {
return (
<div>
<Navbar/>
<SearchBar/>
<RecipesList/>
</div>
);
}
}

搜索栏

export default class SearchBar extends Component {

constructor( props ) {
super( props );

this.state = {
term: ''
};
}

onInputChange( term ) {
this.setState({ term });
}

render( ) {
return (
<div className=" container-fluid search-bar">
<input value={this.state.term} onChange={event => this.onInputChange(event.target.value.substr( 0, 50 ))}/>
Value: {this.state.term}
</div>
);
}

}

食谱列表

const PER_CLICK = 5;

class RecipesList extends Component {

componentWillMount( ) {
this.click = 1;
}

handleButtonClick( ) {
Meteor.subscribe('recipes', PER_CLICK * ( this.click + 1 ));
this.click++;
}

renderList( ) {
return this.props.recipes.map(recipe => {
return (
<div key={recipe._id} className="thumbnail">
<img src={recipe.image} alt="recipes snapshot"/>
<div className="caption">
<h2 className="text-center">{recipe.recipeName}</h2>
</div>
</div>
);
});
}

render( ) {
return (
<ul className="list-group">
{this.renderList( )}
<div className="container-fluid">
<button onClick={this.handleButtonClick.bind( this )} className="btn btn-default">More</button>
</div>
</ul>
);
}
}

// Create Container and subscribe to `recipes` collection
export default createContainer( ( ) => {
Meteor.subscribe( 'recipes', PER_CLICK );
return {recipes: Recipes.find({ }).fetch( )};
}, RecipesList );

最佳答案

应用

class App extends Component {
constructor(props, ctx){
super(props, ctx)

this.state = {
searchQuery: ''
}

this.searchInputChange = this.searchInputChange.bind(this)
}

searchInputChange(event) {
this.setState({
searchQuery: event.target.value.substr( 0, 50 )
})
}

render( ) {
const { searchQuery } = this.state
return (
<div>
<Navbar/>
<SearchBar onChange={this.searchInputChange} value={searchQuery}/>
<RecipesList searchQuery={searchQuery}/>
</div>
)
}
}

App 组件负责处理状态,然后将其作为 props 传递给子级,搜索词可通过 props.searchQuery 提供给 RecipesList

searchInputChange 处理程序作为 props 传递给 SearchBar

搜索栏

export default const SearchBar = ({value, onChange}) => (
<div className=" container-fluid search-bar">
<input value={value} onChange={onChange}/>
Value: {value}
</div>
)

由于 SearchBar 将状态委托(delegate)给父组件,我们可以使用无状态的 React 组件,因为我们只需要来自 props 的信息来渲染它。

一般来说,最好总是有一个 logicalstatefulcontroller 组件来处理状态和逻辑,然后这个组件将状态和方法传递给 presentationalview 组件,这些组件负责用户看到的内容和与之交互的内容。

关于javascript - React - 在 sibling 之间传递状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41028498/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com