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

更新文本输入状态和AJAX搜索相同的值滞后一个字符[重复]

柴嘉禧
2023-03-14

我有一个文本输入搜索栏来查找产品,当我输入术语时,它会发出一个AJAX请求来查找匹配项,并将其设置为产品状态。然而,它落后于一个字符。IE我输入"car",它正在搜索"ca",当我输入"car"时,它用"car"搜索。我猜这与React setState的工作方式有关。如何解决这个问题的提示?

class ProductIndexPage extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      term: '',
      collection: null,
      products: this.props.products
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(event) {
    this.setState({term: event});
    this.searchProducts()
  }
  render() {
    function CreateItem(product) {
      return { 
        url: '/products/' + product.id, 
        attributeOne: product.title,
        attributeTwo: product.variants[0].variant_price,
        attributeThree: '5 prices from $8.99 to $13.99',
        media: <Thumbnail
                  source={product.main_image_src}
                  alt={product.title}
                  size="small"
                />
      }
    }
    function CollectionTitles(collection) {
      return collection.title
    }
    return (
      <Layout>
        <Layout.Section>
          <Card title="Online store dashboard" actions={[{content: 'Edit'}]} sectioned>
            <Card.Section>
              <Stack>
                <TextField 
                  value={this.state.term}
                  label="Keyword Search"
                  placeholder="Enter Term"
                  onChange={this.handleChange}
                />
                <Select
                  value= {this.state.collection}
                  label="Collection"
                  options={ this.props.collections.map(CollectionTitles) }
                  placeholder="Select"
                  //onChange={this.valueUpdater('collection')}
                  //onChange={this.searchProducts('collection')}
                />
              </Stack>
            </Card.Section>
            <Card.Section>
                <ResourceList
                  items={
                      this.state.products.map(CreateItem)
                  }
                  renderItem={(item, index) => {
                    return <ResourceList.Item key={index} {...item} className='Polaris-Card' />;
                  }}
                />
            </Card.Section>
          </Card>
        </Layout.Section>
      </Layout>
    ); 
  }
searchProducts() {
  console.log('In queryProducts');
  console.log('AJAX')
  $.ajax( {
    url: '/products/' + "?term=" + this.state.term, //+ "&collection=" + this.state.collection,
    dataType: 'json',
    success: function(data) {
      console.log('SUCCESS');
      console.log(data)
    this.setState({ products: data });
    }.bind(this),
    error: function(data) {
    }.bind(this)
   });
}

共有1个答案

梁丘伟
2023-03-14

这是因为setState函数是异步的。因此,当您调用setState时,它不会立即设置状态。在调用setState(即状态尚未更新)之后,您正在调用api调用。这就是为什么它调用api时没有最后一个字母。

解决方案::将回调函数传递给setState。当状态为update时将调用该回调。在该回调中,您可以像这样调用api

handleChange(event) {
    this.setState({term: event}, () => {
      this.searchProducts()
    });
  }
 类似资料:
  • 嘿,我有这行代码 我所做的是,当我按下一个按钮时,这个输入的值会改变,会加上1,比如1,然后2,等等。 但我想知道的是我如何得到这个输入的最后一个值,例如,如果我按下五次按钮,我如何在javascript或使用jquery中得到数字5。 我在找一些信息,但什么也找不到。 谢谢。

  • 问题内容: 我希望有 我可以输入的文本框 通过AJAX调用(“获取当前修订版”)更新其值,然后 另一个按钮(“更新代码库”)使另一个AJAX调用文本框中的值 我不知道如何将所有这些结合在一起。 我只想使用javascript,而不要使用jQuery 问题答案:

  • 背景我有一个小索引与一些字符串字段(例如名称,街道,城市,电子邮件)。 和类似于 Lorem ipsum dolor sit amet,consectetuer adipiscing Elit。埃尼·康茂多·利古拉·埃盖特·多洛。埃尼安·马萨。同时也是一个社会成员,即natoque penatibus et magnis dis matraft montes,nascetur loomus mus

  • 试图找出以下原因: 日志“未定义”?第一个日志是“buyin”(无论我在框中键入什么),不确定我做错了什么。非常感谢您的帮助! 问候语, 布拉姆

  • 问题内容: 我想在输入文本字段的同时更新我的​​文本区域,但是在输入时我延迟了1次击键,即当我按下一个键时,会显示上一个键。这是我的代码段 问题答案: 我不建议使用 只需在您的via中添加一个: 里面每个方法(,和)只需要一个电话设置你的文字通过: 这是我做的一个例子:

  • 问题内容: 我是AngularJS的新手,我遇到的一个问题是无法解决,在stackoverflow上也有类似的问题,但似乎并没有帮助我。我基本上有一个可以通过ng- click更新的表单,但是一旦我在任何文本框中输入文本,这些文本框就不再更新。 这是我的HTML 这是有人单击链接时调用的我的函数 问题答案: 您的链接需要登录。 如果我不得不猜测您的问题,则可能与角度范围问题有关。尝试将ng-mod