React.createPortal 及 Modal 的新实现方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React.createPortal 及 Modal 的新实现方式相关的知识,希望对你有一定的参考价值。

参考技术A 一般使用 React 的组件都是挂到父组件的 this.props.children 上面,总是被最近的父组件所捕获,最终到 React 根组件上。

而 Protals 则提供了一种将组件直接挂载到直接父组件 DOM 层次之外的一类方式。

react-dom 提供的具体方法是 ReactDOM.createPortals(child, container) ,这个方法需要两个参数,第一个参数是需要挂载的组件实例,而第二个参数则是要挂载到的DOM节点。一般来说第一个参数可能传递的是需要挂载的 this.props.children

正常来说,我要创建一个 Modal 组件,可以按照下面这么写:

而使用的时候直接引入并且写子组件即可:

最终的效果如下:

Modal 的组件实例这种实现方式也可以,这里的突破方式其实就是直接将 Modal 组件位置进行 fixed 定位。

但是更多时间如果父组件容器存在 overflow: hidden 或者存在 z-index 的时候,需要在视觉上突破父组件的容器,使用 createPortal 更好一些,因为他可以随便将组件挂到任何的 DOM 下。

为了突出 div#root 容器宽度高度很小,并且 overflow:hidden ,给 div#root 一个样式:

新的 Modal 容器组件内容如下:

因为需要保证 ModalContainer 始终保持在最上层,不会被其他 z-index 覆盖掉,因此需要给 div#modal-root 一个样式:

上面只是 Modal 的容器组件,最主要的作用就是将 this.props.children 挂载到组件外部去( div#modal-root )

需要创建 Modal 需要显示的内容组件:

将 ModalContent 挂载到 ModalContainer 中即可:

可以发现,即使主组件是 overflow:hidden 的,但是 modal 能够正常出现,同时,因为 div#modal-root 是 z-index: 999 ,因此会置于最上层。

可以发现,在父组件里捕获一个来自 Portal 的事件冒泡很简单,在开发时不需要完全依赖于 Portal ,对于事件的捕获更加的灵活。

1.React中的事件是包装过的

2.它的 事件冒泡 是根据虚拟DOM树来冒泡,与真实的DOM树无关

CF889EMod Mod Mod DP

【CF889E】Mod Mod Mod

题意:给你一个序列$a_1,a_2...a_n$,定义$f(x,n)=x\mod a_n$,$f(x,i)=x\mod a_i+f(x \mod a_i,i+1) (1 \le i<n)$。

最大化f(x,1)。

$n\le 200000,a_i\le 10^9$

题解:超级神的DP题。(题目名字好暴力啊~)

首先有一个性质,一个数对一个比它小的数取模,最多取log次就会变成0。我们思考如何利用这个性质。

如果我们令f[x][i]就是题目中的f(x,i),那么每次i++的时候我们都要更新所有的dp值。不过我们可以将答案变成i*x+b的形式,那么f[d][i]就代表当x<=d时,最大的b值。这也就是说,我们dp维护的其实使若干条线段,我们要在斜率一定的时候,最大化截距。

思考如何转移,我们从f[d][i]可以转移到$f[d \mod a_i][i+1]$,也可以转移到$f[a_i-1][i+1]$(前提:ai<=d)。我们发现我们可以将所有$f[a_i-1][i+1]$合并,并且对于d<ai的状态,dp值并不改变,我们可以不理会这些状态。所以时间复杂度是多少呢?

上面已经说过了,一个数我们只在它被取模的时候更新状态,并且每次我们只新加入一个数ai-1,所以最终复杂度是$O(n\log n)$的。

当然,如果你像我一样比较懒用map维护dp值,需要再加一个log。

#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=200010;
typedef long long ll;
ll n,ans,v;
map<ll,ll> f;
map<ll,ll>::iterator it;
inline ll rd()
{
	ll ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+(gc^‘0‘),gc=getchar();
	return ret*f;
}
int main()
{
	n=rd();
	ll i,a,b;
	f[rd()-1]=0;
	for(i=2;i<=n;i++)
	{
		v=rd();
		while(f.begin()!=f.end())
		{
			it=f.end(),it--,a=(*it).first,b=(*it).second;
			if(a<v)	break;
			f[v-1]=max(f[v-1],b+(i-1)*(a-a%v-v));
			f[a%v]=max(f[a%v],b+(i-1)*(a-a%v));
			f.erase(it);
		}
	}
	for(it=f.begin();it!=f.end();it++)	ans=max(ans,n*((*it).first)+(*it).second);
	printf("%I64d",ans);
	return 0;
}

以上是关于React.createPortal 及 Modal 的新实现方式的主要内容,如果未能解决你的问题,请参考以下文章

P1495 曹冲养猪

CQOJ 扩展中国剩余定理 数论

解线性同余方程组

E:Modular Stability(组合数)

模块中的条件导入

[CF1103B]Game with modulo