如何获取只需要获取一次的数据
How to fetch data that needs to be fetched only once
我想从 API 端点获取数据,但当我再次返回屏幕或组件时不需要再次获取它。
比如我需要一个配置,它决定了模态对话框的布局,我想只在打开对话框时获取它。
下次,我们打开对话框,我不需要再次获取配置。
我需要 React/Redux 和 Angular 6+ 的解决方案。
对于 Angular,您可以使用服务中的可观察对象来缓存响应。
服务
@Injectable({ providedIn: 'root' })
export class ConfigClass {
private configSource = new ReplaySubject<any>(1); // <-- buffer 1, will emit the last result on subscription
public config$ = this.configSource.asObservable();
constructor(private http: HttpClient) {
this.getConfig(); // <-- call API once
}
getConfig() {
this.http.get('url').subscribe(
res => this.configSource.next(res),
err => this.configSource.error(err)
);
}
}
组件
export class SomeComponent implements OnInit {
config: any;
constructor(private configService: ConfigService) { }
ngOnInit() {
this.configService.config$.subscribe(
res => this.config = res,
err => { }
);
}
}
在反应中,你可以这样做:
Redux 状态
{
MODAL_CONFIG: null // INITIAL STATE AS null
}
YourModal.js
// INSIDE YOUR MODAL COMPONENT
const dispatch = useDispatch(); // FROM react-redux
const MODAL_CONFIG = useSelector((state) => state.MODAL_CONFIG); // FROM react-redux
useEffect(() => { // EFFECT TO FETCH API
if (MODAL_CONFIG === null) { // WILL ONLY FETCH API IF MODAL_CONFIG STATE IS null
fetchApiForConfig().then((data) =>
dispatch(
type: "UPDATE_MODAL_CONFIG",
payload: {config: data}
);
);
}
},[dispatch,MODAL_CONFIG]);
return(
MODAL_CONFIG ?
<YourModalUI/> // IF MODAL_CONFIG EXISTS. DISPLAY MODAL
: <SomeSpinner/> // ELSE DISPLAY SPINNER
);
reducer.js
function reducer(state,action) {
switch(action.type) {
case "UPDATE_MODAL_CONFIG": {
return({
...state,
MODAL_CONFIG: action.payload.config
});
}
default: {
return state;
}
}
}
还有很大的改进空间,但这基本上就是您需要做的。
我想从 API 端点获取数据,但当我再次返回屏幕或组件时不需要再次获取它。
比如我需要一个配置,它决定了模态对话框的布局,我想只在打开对话框时获取它。 下次,我们打开对话框,我不需要再次获取配置。
我需要 React/Redux 和 Angular 6+ 的解决方案。
对于 Angular,您可以使用服务中的可观察对象来缓存响应。
服务
@Injectable({ providedIn: 'root' })
export class ConfigClass {
private configSource = new ReplaySubject<any>(1); // <-- buffer 1, will emit the last result on subscription
public config$ = this.configSource.asObservable();
constructor(private http: HttpClient) {
this.getConfig(); // <-- call API once
}
getConfig() {
this.http.get('url').subscribe(
res => this.configSource.next(res),
err => this.configSource.error(err)
);
}
}
组件
export class SomeComponent implements OnInit {
config: any;
constructor(private configService: ConfigService) { }
ngOnInit() {
this.configService.config$.subscribe(
res => this.config = res,
err => { }
);
}
}
在反应中,你可以这样做:
Redux 状态
{
MODAL_CONFIG: null // INITIAL STATE AS null
}
YourModal.js
// INSIDE YOUR MODAL COMPONENT
const dispatch = useDispatch(); // FROM react-redux
const MODAL_CONFIG = useSelector((state) => state.MODAL_CONFIG); // FROM react-redux
useEffect(() => { // EFFECT TO FETCH API
if (MODAL_CONFIG === null) { // WILL ONLY FETCH API IF MODAL_CONFIG STATE IS null
fetchApiForConfig().then((data) =>
dispatch(
type: "UPDATE_MODAL_CONFIG",
payload: {config: data}
);
);
}
},[dispatch,MODAL_CONFIG]);
return(
MODAL_CONFIG ?
<YourModalUI/> // IF MODAL_CONFIG EXISTS. DISPLAY MODAL
: <SomeSpinner/> // ELSE DISPLAY SPINNER
);
reducer.js
function reducer(state,action) {
switch(action.type) {
case "UPDATE_MODAL_CONFIG": {
return({
...state,
MODAL_CONFIG: action.payload.config
});
}
default: {
return state;
}
}
}
还有很大的改进空间,但这基本上就是您需要做的。