小编FMC*_*orz的帖子

使用React钩子等同于componentDidUpdate

tldr; 如何模拟componentDidUpdate或以其他方式使用key数组来强制重置组件?

我正在实现一个显示计时器的组件,并在达到零时执行回调.目的是让回调更新对象列表.后一个组件由新的React钩子 useStateuseEffect.

state包含对计时器启动时间和剩余时间的引用.该effect套间隔称为每秒钟更新的剩余时间,并检查是否回调应该叫.

该组件并不意味着重新安排定时器,或者当它达到零时保持间隔,它应该执行回调和空闲.为了让计时器刷新,我希望传递一个数组,key这将导致组件的状态被重置,因此计时器将重新启动.不幸的是key必须与字符串一起使用,因此我的数组的引用是否已更改不会产生任何影响.

我还试图通过传递我关注的数组来推动对道具的更改,但状态得到维护,因此间隔未重置.

为了强制仅使用新的钩子API更新状态,在数组中观察浅层更改的首选方法是什么?

import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';

function getTimeRemaining(startedAt, delay) {
    const now = new Date();
    const end = new Date(startedAt.getTime() + delay);
    return Math.max(0, end.getTime() - now.getTime());
}

function RefresherTimer(props) {
    const [startedAt, setStartedAt] = useState(new Date());
    const [timeRemaining, setTimeRemaining] = useState(getTimeRemaining(startedAt, props.delay));

    useEffect(() => {

        if (timeRemaining <= 0) …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-hooks

27
推荐指数
3
解决办法
2万
查看次数

澄清整个PHP版本中的XXE漏洞

我在这里发布一个问题作为最后的手段,我浏览了网页并经历了许多尝试,但没有成功.

复制XXE攻击是我想要做的,为了防止它们,但我似乎无法理解PHP与XML实体的工作方式.为了记录,我在Ubuntu 12.04上使用PHP 5.5.10,但是我已经对5.4和5.3进行了一些测试,而libxml2似乎是2.7.8版(它似乎没有包含默认的不解析实体).

在下面的示例中,使用true或false调用libxml_disable_entity_loader()无效,或者我做错了什么.

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

libxml_disable_entity_loader(true);
$dom = new DOMDocument();
$dom->loadXML($xml);

// Prints Test.
print $dom->textContent;
Run Code Online (Sandbox Code Playgroud)

但是,我可以专门将一些参数传递给loadXML()以允许一些选项,并且当实体是本地文件时工作,而不是当它是外部URL时.

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c PUBLIC "bar" "/etc/passwd">
]>
<root>
    <test>Test</test>
    <sub>&c;</sub>
</root>
XML;

$dom = new DOMDocument();
$dom->loadXML($xml, LIBXML_NOENT | LIBXML_DTDLOAD);

// Prints Test.
print $dom->textContent;
Run Code Online (Sandbox Code Playgroud)

现在,如果我们将实体更改为其他内容,如下例所示,实体已解析但我无法使用参数或函数禁用它...发生了什么?!

$xml = <<<XML
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY c "Blah …
Run Code Online (Sandbox Code Playgroud)

php xml security xxe

16
推荐指数
1
解决办法
5363
查看次数

在开发模式下使用 Create-React-App 配置 TypeScript 目标

太棒了;如何配置我的 CRA 项目,以便生成yarn start与旧版浏览器兼容的版本?

不知道我做错了什么,但我本质上是在 CRA 中使用 TypeScript,并且想在较旧的 Chrome 上运行开发版本。准确地说,它是在智能电视上运行的 Chrome 53。由于我正在开发一款在电视上运行的应用程序,并且想在我可用的应用程序上进行测试,因此运行与该电视兼容的版本至关重要。

当我在电视上运行当前的开发版本时,浏览器抱怨语法错误。可能是因为构建中包含了高级 JS 功能(箭头函数、const,...)。

所以我做的第一件事就是更新tsconfig.json目标es3而不是当前所在的位置:es5。我没想到这会产生影响,因为 ES5 显然应该在 Chrome 53 上运行良好。

然后,我尝试自定义browserlistpackage.json版本以包含该版本的 Chrome,甚至将生产设置复制到开发设置,但无济于事。当我检查桌面上生成的 JavaScript 时,它仍然包含 ES6 功能。

显然,我非常不熟悉 TypeScript 和 CRA(听 Babel)如何协同工作。我尝试检查 CRA 的源代码,并弹出应用程序来猜测为什么我的尝试不起作用,但我迷失了。

(请注意,该项目是几天前根据 CRA 的 TypeScript 模板创建的,因此它确实是最新的。)

typescript reactjs create-react-app

1
推荐指数
1
解决办法
1793
查看次数