小编Lou*_*her的帖子

有状态(使用钩子)功能组件中的默认道具

我在 SO 上遇到了几个关于功能组件的默认 props 的问题,他们都推荐使用 ES6 默认参数。以下是这些问题的链接。


但是,当我使用该方法编写具有在 props 更改上运行的效果的组件时,我会遇到非基元的不良行为。例如,以下代码将导致无限循环。

const Parent = () => {
  let somethingUndefined;

  return (
    <div>
      <Child prop={somethingUndefined} />
    </div>
  );
};

const Child = ({ prop = {a: 1} }) => {
  const [x, setX] = React.useState(1);

  React.useEffect(() => {
    setX(x + 1);
  }, [prop]);

  return <div>{x}, {prop.a}</div>;
};

ReactDOM.render(<Parent />, document.getElementsByTagName('body')[0]);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.11.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.11.0/umd/react-dom.production.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


我尝试了两种尝试规避问题的方法。首先,只需分配一个包含默认值的不同变量,并将未修改的 prop 放入依赖数组中。IE

const Child = ({ prop }) …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-hooks

6
推荐指数
2
解决办法
3427
查看次数

为什么 JS 中的类/函数构造函数将字符串计算为表达式?

我查看了eslint-plugin-security中的一条规则,发现用户输入理论上可能会导致远程代码执行错误。

const a = class {};
console.log(a['constructor']);
a['constructor']('console.log(1)')();

function b() {}
console.log(b['constructor']);
b['constructor']('console.log(2)')();

const c = {}
console.log(c['constructor'])
console.log(c['constructor']('console.log(3)')());
Run Code Online (Sandbox Code Playgroud)

从代码片段中很容易看出类和函数的构造函数似乎解析字符串并将它们评估为有效代码。由于某种原因,对象不会表现出这种行为。

为什么会允许这种情况发生?JavaScript 的哪些功能需要函数/类构造函数的这种行为?我假设它是 JavaScript 工作方式不可或缺的一部分,否则我不明白为什么它没有从语言中删除。

javascript security node.js

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

标签 统计

javascript ×2

node.js ×1

react-hooks ×1

reactjs ×1

security ×1