当前位置: 首页 > 知识库问答 >
问题:

兄弟姐妹之间的反应传递状态?

叶煌
2023-03-14

基本上是新的反应,我有点困惑如何正确地传递组件之间的状态。我发现一个类似的问题已经出现了——将表单元素状态传递给兄弟/父元素的正确方法是什么?但是我想知道你能否给我一个关于下面代码的具体答案。

目前应用的结构包括:

  • 父组件-应用程序
  • 2个孩子:搜索栏食谱列表

目标是对我的Meteor收藏进行异步搜索,并仅显示与搜索词匹配的配方。

现在,我只是展示我的流星系列中的所有配方。我创建了一个名为SearchBar的有状态组件,它将输入值保存为this.state.term。我们的想法是将状态传递给RecipesList,但我不确定这样做是否正确。或者,我让App处理状态并将其传递给孩子们。我相信这是一种非常常见的情况,你是如何做到的?

App

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 );

共有2个答案

翟丰茂
2023-03-14

定义App组件的状态术语。还要编写处理输入函数,并将其作为porps传递给搜索栏组件

handleInput(val) {
this.setState({
    term: val,
});
}

当搜索栏中的内容被键入(onKeyUp)时,添加侦听器句柄输入。

同时创建

现在,在渲染函数RecipesList中,从列表中筛选出要显示的配方

诸葛茂勋
2023-03-14

App

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组件负责处理状态,然后将其作为道具传递给子级,seach术语可通过props.search查询提供给RecipeList

searchInputChange处理程序作为道具向下传递到SearchBar

搜索栏

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

由于SearchBar将状态委托给父组件,我们可以使用无状态的反应组件,因为我们只需要道具中的信息来呈现它。

一般来说,最好有一个逻辑或有状态的组件来处理状态和逻辑,然后这个组件将状态和方法传递给表示视图。/code>负责用户看到和交互的组件。

 类似资料:
  • 问题内容: 我正在尝试使用NHibernate 3.0的LINQ接口执行以下操作。我想查询一个对象(使用一些Where子句),并加载一些子代和孙代。目前,我正在这样做: 但是,这将导致所有子孙之间的笛卡尔积(每个结果行包含许多列)。这在这里由“ ayende”讨论。另一方面,我得到了一次往返,这与拆分查询然后进行合并不同。 在仍使用NHibernate的LINQ接口的情况下,如何更好地(在SQL和

  • 问题内容: 我有两个同级元素,每个元素都包含动态内容。 在某些情况下,然后会有更多的内容,反之亦然。我希望第二个元素的高度始终等于第一个元素的高度。如果的高度更大,则其高度将溢出div,因此可以滚动。 有什么方法可以通过Flexbox做到这一点? 问题答案: 是的,有可能。让兄弟姐妹单独设置最大高度,并设置其他人的和,然后根据规范将其扩展到他们兄弟姐妹的高度。没有绝对定位。没有设置任何元素的高度。

  • 我试图定位页面上的特定元素,但无法找到要使用的适当Xpath。 以下是HTML(注意每个div的位置可能不同): 我可以通过以下操作(使用JAVA)成功定位标签: 并且我可以成功地定位第一个元素下的第一个输入(但我可能并不总是想要第一个元素): 所以问题是(i)输入的名称标记和值总是不同的,所以它们不能用来选择元素;(ii)带有姓氏标签的div可能不总是第二个;(iii)标签和span是同一级别的

  • 我一直在读这篇文章:多嵌套路由反应路由器多姆v4和一些喜欢它,我不能让我的情况下工作。 这里有两个repl在尝试文章中描述的每种方法——也许我错过了什么? 如果您可以让这些REPL中的任何一个工作,我可能已经准备好了——但我更喜欢模块化的方法。谢谢你的帮助。 模块化为路线https://codepen.io/anon/pen/XGPKwZ?editors=0010 航线周围的集装箱https://

  • 我有两个项目,一个是aspnet核心API项目,另一个是xUnit e2e项目,两者都部署在两个不同的容器中。 一旦两个容器都启动并运行,e2e容器就会尝试在url上访问Web API项目的APIhttps://web-api-container:5010/.但e2e项目无法实现API项目。似乎无法使用其主机名访问API项目(http://web-api-container:5010/). 我的c

  • null null 就像在我的示例中一样,如果我有一个C1的大型呈现,我真的不想仅仅因为C1有一个form元素就把C1的整个放到P的中。 我该怎么做?