@kamran.davar
سلام . من یه مشکلی با https://ant.design/components/select/#components-select-demo-select-users دارم ممنون میشم راهنماییم کنید
من اون قسمتی که fetch انجام شده میخوام با axios انجامش بدم چون توکن داره صفحاتم و به صورت دیفالت توی هدر axios اون رو قرار دادم. ولی دو تا اشکال داره وقتی axios رو استفاده کردم. یکی اینکه فکر نمیکنم سرچش درست کار بکنه. یکی اینکه وقتی یه چیزی تایپ میکنم اول سلکت باکس رو میبنده و برای اینکه ریزالت رو ببینم باید دوباره روی سلکت باکس کلیک بکنم. ممنون میشم کمکم کنید
این کدیه که axios رو اضافش کردم.
fetchUser = value => {
console.log('fetching user', value);
this.lastFetchId += 1;
const fetchId = this.lastFetchId;
this.setState({ data: [], fetching: true });
axios.get(`${window.REACT_APP_CONFIG.REACT_APP_EMC_URL}api/customers?take=10`).then((response) => {
console.log("customeeeeeeeeeeeeeeers", response)
// if (fetchId !== this.lastFetchId) {
// // for fetch callback order
// return;
// }
const data = response.data.customers.map(user => ({
text: user.familyName,
value: user.code,
}));
this.setState({ data, fetching: false });
})
// fetch(`${window.REACT_APP_CONFIG.REACT_APP_EMC_URL}api/customers?take=10`)
// .then(response => response.json())
// .then(body => {
// console.log("the body", body)
// if (fetchId !== this.lastFetchId) {
// // for fetch callback order
// return;
// }
// // const data = body.data.customers.map(user => ({
// // text: user.familyName,
// // value: user.code,
// // }));
// // this.setState({ data, fetching: false });
// });
};شاید پاسخ شما همینجا باشد
چون با کد خود antd هم وقتی از axios استفاده میکنم جواب نمیده. آقای داور ممنون میشم کد خود antd رو بگین چجوری با axios باید نوشت
@kamran.davar
import { Select, Spin } from 'antd';
import debounce from 'lodash/debounce';
import React from 'react';
const { Option } = Select;
class Test extends React.Component {
constructor(props) {
super(props);
this.lastFetchId = 0;
this.fetchUser = debounce(this.fetchUser, 800);
}
state = {
data: [],
value: [],
fetching: false,
};
fetchUser = value => {
console.log('fetching user', value);
this.lastFetchId += 1;
const fetchId = this.lastFetchId;
this.setState({ data: [], fetching: true });
fetch('https://randomuser.me/api/?results=5')
.then(response => response.json())
.then(body => {
if (fetchId !== this.lastFetchId) {
// for fetch callback order
return;
}
const data = body.results.map(user => ({
text: `${user.name.first} ${user.name.last}`,
value: user.login.username,
}));
this.setState({ data, fetching: false });
});
};
handleChange = value => {
this.setState({
value,
data: [],
fetching: false,
});
};
render() {
const { fetching, data, value } = this.state;
return (
<Select
mode="multiple"
labelInValue
value={value}
placeholder="Select users"
notFoundContent={fetching ? <Spin size="small" /> : null}
filterOption={false}
onSearch={this.fetchUser}
onChange={this.handleChange}
style={{ width: '100%' }}
>
{data.map(d => (
<Option key={d.value}>{d.text}</Option>
))}
</Select>
);
}
}
export default Test;@kamran.davar
با axios که مینویسمش همین کد خودشو. ولی باز همون دو تا مشکل رو داره. یک اینکه فکر نمیکنم سرچش کار کنه. دو اینکه همون موقع که سلکت بازه ریزالتو نمیده یه بار خودشو میبنده و بار بعد که سلکت رو باز میکنی ریزالت رو میده در حالی که این حالت با fetch که خودش کد زده اتفاق نمی افته.. ممنون میشم کمک کنید
fetchUser = value => {
console.log('fetching user', value);
this.lastFetchId += 1;
const fetchId = this.lastFetchId;
this.setState({ data: [], fetching: true });
// fetch('https://randomuser.me/api/?results=5')
// .then(response => response.json())
// .then(body => {
// if (fetchId !== this.lastFetchId) {
// // for fetch callback order
// return;
// }
// const data = body.results.map(user => ({
// text: `${user.name.first} ${user.name.last}`,
// value: user.login.username,
// }));
// this.setState({ data, fetching: false });
// });
axios.get('https://randomuser.me/api/?results=5').then((response)=>{
debugger
if (fetchId !== this.lastFetchId) {
// for fetch callback order
return;
}
const data = response.data.results.map(user => ({
text: `${user.name.first} ${user.name.last}`,
value: user.login.username,
}));
this.setState({ data, fetching: false });
})
};اینکه سرچش کار نمیکنه به دلیل اینه که بک اندش سرچ رو پشیتیبانی نمیکنه
اما مشکل دوم
من همین کد شما رو کپی کردم تو پزوژه خودم و دیدم که تغییر فتچ به اکسیوس هیچ تفاوتی در نتیجه ندارن
هیچ مشکلی نداشتم
وقتی سلکت بازه درخواست که زده میشه لیست جستوجو میره تو حالت لودینگ و بلافاصله بعد از برگشت جواب درخواست لیست از حالت لودینگ خارج میشه و لیت جدید رو نشون میده. بدون نیاز به کلیک. همه چی درست و دقیقه
@kamran.davar
لیست رو میبنده بعد از اتمام جستجو. و بعد باید لیست رو باز کنی تا نتایج رو ببینی. با همین کدهای بالا.
@hesammousavi
@sinashahoveisi
@kamran.davar
سلام. هنوز برای این مشکل راحی پیدا نکردم.. ممنون میشم کمک کنید. این کد دیفالت خود انت دیزاینه که برای اینه که یه چیزی رو سرچ بکنی توی سلکت باکس و بر اساس اون سرچت api رو کال میکنه و ریزالت رو میگیره. ولی وقتی به جای fetch از axios استفاده میکنم بعد از سرچ سلکت رو میبنده و وقتی سلکت رو باز میکنیم مجدد میتونیم نتایج رو ببینیم
import { Select, Spin } from 'antd';
import debounce from 'lodash/debounce';
import React from 'react';
const { Option } = Select;
class Test extends React.Component {
constructor(props) {
super(props);
this.lastFetchId = 0;
this.fetchUser = debounce(this.fetchUser, 800);
}
state = {
data: [],
value: [],
fetching: false,
};
fetchUser = value => {
console.log('fetching user', value);
this.lastFetchId += 1;
const fetchId = this.lastFetchId;
this.setState({ data: [], fetching: true });
fetch('https://randomuser.me/api/?results=5')
.then(response => response.json())
.then(body => {
if (fetchId !== this.lastFetchId) {
// for fetch callback order
return;
}
const data = body.results.map(user => ({
text: `${user.name.first} ${user.name.last}`,
value: user.login.username,
}));
this.setState({ data, fetching: false });
});
};
handleChange = value => {
this.setState({
value,
data: [],
fetching: false,
});
};
render() {
const { fetching, data, value } = this.state;
return (
<Select
mode="multiple"
labelInValue
value={value}
placeholder="Select users"
notFoundContent={fetching ? <Spin size="small" /> : null}
filterOption={false}
onSearch={this.fetchUser}
onChange={this.handleChange}
style={{ width: '100%' }}
>
{data.map(d => (
<Option key={d.value}>{d.text}</Option>
))}
</Select>
);
}
}
export default Test;
عملکردش باید مثل این لینک باشه
@kamran.davar دیگه پروژه رو عوض کردم و تست گرفتم درس کار کرد.. واقعا نمیفهمم چی تو پروژه ای که میخوام توش این کد رو بزنم هست که این مشکل بوجود میاد. دقیقا کدها باز مثل بالاس
@kamran.davar بله استفاده شده. از این میتونه باشه؟