gpt4 book ai didi

javascript - 如何创建跨所有平台的共享单例组件?

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:14 25 4
gpt4 key购买 nike

我正在考虑创建一个名为 LoadingMask 的 React 组件,我可以在其中显示或不显示(取决于状态)来自任何组件的加载掩码。这个想法是在 ajax 调用之前显示它,并在我收到数据后隐藏它。

我不想同时显示两个掩码,所以如果一个组件发出请求,而另一个组件创建另一个请求,我想在我的“MaskCounter”中加 1,并在请求时减一完成了。如果计数器为 0,我需要隐藏 LoadingMask。

我为了做到这一点,我想我需要创建一个“单例”组件,我可以在整个平台上共享它,所以只有一个 LoadingMask。我也不认为向所有组件发送事件以隐藏/显示掩码是件好事。

有什么想法吗?

最佳答案

要在组件之间共享数据,您可以:

  • 使用类似Redux 的库,并在共享存储中保存您的掩码加载器状态
  • 使用React context api从您的根组件,并将加载器状态共享给所有子组件。请参阅下面的示例:

class Application extends React.Component {
constructor() {
super();

this.state = {
nbTasks: 0
};

this.addTask = this.addTask.bind(this);
this.removeTask = this.removeTask.bind(this);
this.isLoading = this.isLoading.bind(this);
}

addTask() {
this.setState(prevState => ({
nbTasks: prevState.nbTasks + 1
}));
}

removeTask() {
this.setState(prevState => ({
nbTasks: prevState.nbTasks - 1
}));
}

isLoading() {
return this.state.nbTasks > 0;
}

getChildContext() {
return {
addTask: this.addTask,
removeTask: this.removeTask,
isLoading: this.isLoading
};
}

render() {
return (
<div>
<ComponentX />
<ComponentY />
<LoadingMask />
</div>
);
}
}

Application.childContextTypes = {
addTask: PropTypes.func,
removeTask: PropTypes.func,
isLoading: PropTypes.func
};

const LoadingMask = (props, context) => (
context.isLoading()
? <div>LOADING ...</div>
: null
);

LoadingMask.contextTypes = {
isLoading: PropTypes.func
};

class ComponentX extends React.Component {
constructor(props, context) {
super(props, context);
this.state = {
message: 'Processing ...'
};
}

componentDidMount() {
this.context.addTask();

setTimeout(() => {
this.setState({
message: 'ComponentX ready !'
});

this.context.removeTask();
}, 3500);
}

render() {
return (
<div>
<button disabled>{this.state.message}</button>
</div>
);
}
}

ComponentX.contextTypes = {
addTask: PropTypes.func,
removeTask: PropTypes.func
};

class ComponentY extends React.Component {
constructor(props, context) {
super(props, context);

this.state = {
message: 'Processing ...'
};
}

componentDidMount() {
this.context.addTask();

setTimeout(() => {
this.setState({
message: 'ComponentY ready !'
});

this.context.removeTask();
}, 6000);
}

render() {
return (
<div>
<button disabled>{this.state.message}</button>
</div>
);
}
}

ComponentY.contextTypes = {
addTask: PropTypes.func,
removeTask: PropTypes.func
};

ReactDOM.render(
<Application />,
document.getElementById('app')
);
<script src="https://unpkg.com/prop-types/prop-types.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js"></script>

<div id="app"></app>

关于javascript - 如何创建跨所有平台的共享单例组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44726316/

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