gpt4 book ai didi

javascript - 如何在事件 onChange 上设置超时

转载 作者:行者123 更新时间:2023-11-30 06:23:19 26 4
gpt4 key购买 nike

我有一个显示图片的图库,还有一个搜索文本框我正在尝试使用输入事件超时来防止对我输入的每个字母进行 api 调用:我尝试使用 doSearch 函数 onChange 来处理事件:但现在我不能在文本框中写任何东西,它会导致很多错误附加到此 session 的应用程序和图库组件

提前致谢

class App extends React.Component {
static propTypes = {
};

constructor() {
super();
this.timeout = 0;
this.state = {
tag: 'art'
};
}


doSearch(event){
var searchText = event.target.value; // this is the search text
if(this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(function(){this.setState({tag: event.target.value})} , 500);
}

render() {
return (
<div className="app-root">
<div className="app-header">
<h2>Gallery</h2>
<input className="input" onChange={event => this.doSearch(event)} value={this.state.tag}/>
</div>
<Gallery tag={this.state.tag}/>
</div>
);
}
}

export default App;

这是图库类:

import React from 'react';
import PropTypes from 'prop-types';
import axios from 'axios';
import Image from '../Image';
import './Gallery.scss';

class Gallery extends React.Component {
static propTypes = {
tag: PropTypes.string
};

constructor(props) {
super(props);
this.state = {
images: [],
galleryWidth: this.getGalleryWidth()

};
}

getGalleryWidth(){
try {
return document.body.clientWidth;
} catch (e) {
return 1000;
}
}
getImages(tag) {
const getImagesUrl = `services/rest/?method=flickr.photos.search&api_key=522c1f9009ca3609bcbaf08545f067ad&tags=${tag}&tag_mode=any&per_page=100&format=json&safe_search=1&nojsoncallback=1`;
const baseUrl = 'https://api.flickr.com/';
axios({
url: getImagesUrl,
baseURL: baseUrl,
method: 'GET'
})
.then(res => res.data)
.then(res => {
if (
res &&
res.photos &&
res.photos.photo &&
res.photos.photo.length > 0
) {
this.setState({images: res.photos.photo});
}
});
}

componentDidMount() {
this.getImages(this.props.tag);
this.setState({
galleryWidth: document.body.clientWidth
});
}

componentWillReceiveProps(props) {
this.getImages(props.tag);
}

render() {
return (
<div className="gallery-root">
{this.state.images.map((dto , i) => {
return <Image key={'image-' + dto.id+ i.toString()} dto={dto} galleryWidth={this.state.galleryWidth}/>;
})}
</div>
);
}
}

最佳答案

首先为什么你需要使用 setTimeout 来设置用户输入的值。我没有看到在 doSearch 函数中使用 setTimeout 有任何用处。

您的 doSearch 函数不起作用的原因是您没有绑定(bind)它。

您可以通过以下方式在doSearch函数中使用setState直接给标签设置值。

ES5方式

constructor(props){
super(props);
this.doSearch = this.doSearch.bind(this);
}

doSearch(event){
this.setState({
tag: event.target.value
});
}

ES6方式

doSearch = (event) => {
this.setState({
tag: event.target.value
});
}

在 doSearch 函数中的 setTimeout 中执行 setState 是行不通的,因为输入标签已分配值。

ES5方式

constructor(props){
super(props);
this.doSearch = this.doSearch.bind(this);
}

doSearch(event){
if(this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(function(){
this.setState({
tag: event.target.value
})
}.bind(this),500);
}

ES6方式设置超时

doSearch = (event) => {
if(this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.setState({
tag: event.target.value
})
},500);
}

图库组件:

在 componentWillRecieveProps 中检查当前 props 的变化,以避免额外的渲染。

试试下面更新的代码

import React from 'react';
import PropTypes from 'prop-types';
import axios from 'axios';
import Image from '../Image';
import './Gallery.scss';

class Gallery extends React.Component {
static propTypes = {
tag: PropTypes.string
};

constructor(props) {
super(props);
this.state = {
images: [],
galleryWidth: this.getGalleryWidth()

};
}

getGalleryWidth(){
try {
return document.body.clientWidth;
} catch (e) {
return 1000;
}
}
getImages(tag) {
const getImagesUrl = `services/rest/?method=flickr.photos.search&api_key=522c1f9009ca3609bcbaf08545f067ad&tags=${tag}&tag_mode=any&per_page=100&format=json&safe_search=1&nojsoncallback=1`;
const baseUrl = 'https://api.flickr.com/';
axios({
url: getImagesUrl,
baseURL: baseUrl,
method: 'GET'
})
.then(res => res.data)
.then(res => {
if (
res &&
res.photos &&
res.photos.photo &&
res.photos.photo.length > 0
) {
this.setState({images: res.photos.photo});
}
});
}

componentDidMount() {
this.getImages(this.props.tag);
this.setState({
galleryWidth: document.body.clientWidth
});
}

componentWillReceiveProps(nextProps) {
if(nextProps.tag != this.props.tag){
this.getImages(props.tag);
}
}

shouldComponentUpdate(nextProps, nextState) {
if(this.props.tag == nextProps.tag){
return false;
}else{
return true;
}
}

render() {
return (
<div className="gallery-root">
{this.state.images.map((dto , i) => {
return <Image key={'image-' + dto.id+ i.toString()} dto={dto} galleryWidth={this.state.galleryWidth}/>;
})}
</div>
);
}
}

我将标签初始值保持为空,因为您没有对值(value)艺术做任何事情。

请尝试使用以下代码

class App extends React.Component {
static propTypes = {
};

constructor() {
super();
this.timeout = 0;
this.state = {
tag: '',
callGallery: false
};
}


doSearch = (event) => {
this.setState({tag: event.target.value, callGallery: false});
}

handleSearch = () => {
this.setState({
callGallery: true
});
}

render() {
return (
<div className="app-root">
<div className="app-header">
<h2>Gallery</h2>
<input className="input" onChange={event => this.doSearch(event)} value={this.state.tag}/>
<input type="button" value="Search" onClick={this.handleSearch} />
</div>
{this.state.callGallery && <Gallery tag={this.state.tag}/>}
</div>
);
}
}

export default App;

关于javascript - 如何在事件 onChange 上设置超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855807/

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