React 文档说明了以下内容 useMemo
您可以依赖 useMemo 作为性能优化,而不是语义保证。将来,React 可能会选择“忘记”一些先前记忆的值并在下一次渲染时重新计算它们,例如为屏幕外组件释放内存。编写您的代码,使其在没有 useMemo 的情况下仍然可以工作——然后添加它以优化性能。
因为useCallback有以下行:
useCallback(fn, deps) 等价于 useMemo(() => fn, deps)。
“等效”这个词对我来说有点模糊,我不知道这是否也意味着useCallback不提供语义保证。
我正在尝试从 Material UI 自定义 Select 组件。
它看起来是这样的:
但是,当选择组件获得焦点时,我想将边框颜色从材质 UI 的蓝色更改为自定义红色。
我尝试设置样式,但它根本没有做任何事情
import FormControl from '@material-ui/core/FormControl';
import InputLabel from '@material-ui/core/InputLabel';
import MuiSelect from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';
import { makeStyles } from '@material-ui/core/styles';
const useStyles = makeStyles((theme) => ({
formControl: {
margin: theme.spacing(1),
minWidth: 120,
},
select: {
borderColor: '#FF0000', //<------------ this does nothing
},
}));
const Select = () => {
const classes = useStyles();
return (
<FormControl variant="outlined" className={classes.formControl}>
<InputLabel>Months</InputLabel>
<MuiSelect label="Months" className={classes.select}>
<MenuItem value="1">January</MenuItem>
<MenuItem value="2">February</MenuItem>
<MenuItem …Run Code Online (Sandbox Code Playgroud) 我知道这似乎是一个不寻常的例子,但我似乎仍然无法准确解释为什么我在单击 div 后从未在控制台上看到valueB打印出来?
请注意,由于我在 a 中调用了两个 set state 调用setTimeout,因此它们不是批处理的。
function App() {
let [a, setA] = React.useState();
let [b, setB] = React.useState();
React.useEffect(() => {
console.log('Entering useEffect', a, b);
return () => {
console.log('Entering cleanup', a, b);
setA(null);
setB(null);
};
}, [a, b]);
console.log('Render', a, b);
return (
<div
onClick={() => {
setTimeout(() => {
setA('valueA');
setB('valueB');
}, 100);
}}
>
<h1>Test App</h1>
</div>
);
}
ReactDOM.render(
<App/>,
document.getElementById("react")
);Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.1/umd/react-dom.production.min.js"></script> …Run Code Online (Sandbox Code Playgroud)通常,当我处理表单提交时,我使用useState输入值并将onChange事件设置为
const [inputValues, setInputValues] = useState({
title: "",
address: "init"
});
function submitHandler(e) {
e.preventDefault();
const meetupData = {
meetupTitle: inputValues.title,
};
console.log(meetupData);
}
return (
<form onSubmit={submitHandler}>
<div>
<label htmlFor="title">Meetup Title</label>
<input
type="text"
required
id="title"
value={inputValues.title}
onChange={(e) =>
setInputValues({ ...inputValues, title: e.target.value })
}
/>
</div>
<div>
<button>Add Meetup</button>
</div>
</form>
);
Run Code Online (Sandbox Code Playgroud)
但在一些教程中我发现它是用useRefas编写的
const titleInputRef = useRef();
function submitHandler(e) {
e.preventDefault();
const enteredTitle = titleInputRef.current.value;
const meetupData = {
title: enteredTitle,
};
console.log(meetupData); …Run Code Online (Sandbox Code Playgroud) 例如下面的代码
int a = -7777;
int b = 10;
cout<< a % b<<endl;
cout<<(a+b)%b<<endl;
cout<< -7777%10 <<endl;
Run Code Online (Sandbox Code Playgroud)
结果是:
-7
-7
-7
Run Code Online (Sandbox Code Playgroud)
但如果我将b的类型更改为unsigned int,则它具有不同的值;
int a = -7777;
unsigned int b = 10;
cout<< a % b<<endl;
cout<<(a+b)%b<<endl;
cout<< -7777%10 <<endl;
Run Code Online (Sandbox Code Playgroud)
结果是
9
9
-7
Run Code Online (Sandbox Code Playgroud)
有人可以建议它是如何在这里工作的吗?差异是如何产生的?
顺便说一句:我在Xcode最新版本中使用C++.
我正在努力学习节点.考虑一下这段代码(基于官方MongoDB Node.js驱动程序)
// Retrieve all the documents in the collection
collection.find().toArray(function(err, documents) {
assert.equal(1, documents.length);
assert.deepEqual([1, 2, 3], documents[0].b);
db.close();
});
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
find同步还是异步?如果它是异步的,那么.toArray函数调用会使我感到困惑,因为通常我会期待某些东西
collection.find(function(err, results){});
Run Code Online (Sandbox Code Playgroud)具体我感兴趣的是什么机制可以让你调用一个.toArray对异步函数的结果?因为我得到的异步函数很少返回一些东西(我认为除了promises),而是调用传递给它们的回调.有人能用find来澄清这种情况.toArray吗?
例如,在这个问题的接受答案中:如何在MongoDB collection.find()上获得回调,你可以看到作者调用find我想象的方式,并cursor在回调函数中接收.这对我很好,这就是我期望它的工作方式.但链接异步调用的结果find(如果它是asynch?),toArray有点让我感到困惑.
我的推测是find返回一个句柄类的东西,此时的数据还没有从DB加载,只有当你调用toArray实际数据到达时.我对吗?
有这样一个问题,虽然很老,但似乎没有帮助。我有回购。在 repo 中,我有一个大约 6MB 的 gif 文件。它发生了,所以我推送了这个 GIF 的不同版本,显然它们都存储在 .git 文件夹中,这使得 git 文件夹的大小约为 40MB。
从我尝试按照链接问题中的建议运行的项目文件夹中:
git repack -a -d --depth=250 --window=250
Run Code Online (Sandbox Code Playgroud)
但这并没有影响 .git 文件夹的大小(我是否必须推动才能看到缩小的大小?)。我可以做些什么来减少 .git 文件夹的大小?
同样尝试git gc似乎没有减少 .git 文件夹的大小。
据我了解,两者之间的区别在于,如果返回函数、对象或数组,则使用 useCallback,而返回原语时则使用 useMemo。但我正在查找去抖(这是文章: https: //dmitripavlutin.com/react-throttle-debounce/,它说 useMemo 将是一个更好的解决方案。使用 useCallback
import { useState, useCallback } from 'react';
import debounce from 'lodash.debounce';
export function FilterList({ names }) {
const [query, setQuery] = useState("");
let filteredNames = names;
if (query !== "") {
filteredNames = names.filter((name) => {
return name.toLowerCase().includes(query.toLowerCase());
});
}
const changeHandler = event => {
setQuery(event.target.value);
};
const debouncedChangeHandler = useCallback(
debounce(changeHandler, 300)
, []);
return (
<div>
<input
onChange={debouncedChangeHandler}
type="text"
placeholder="Type a query..."
/>
{filteredNames.map(name => <div key={name}>{name}</div>)}
</div> …Run Code Online (Sandbox Code Playgroud) 我正在开发一个组件,我从 URL 读取查询参数并在 useEffect 中发布请求,由于严格模式,这会执行两次。该请求是非幂等的,处理这种情况的最佳方法是什么?
我正在考虑维护一个包含请求是否已执行的引用,如果请求已执行则不执行该请求。
在 React文档中,我对 setState 的使用感到困惑。看到这个
handleCelsiusChange(temperature) {
this.setState({scale: 'c', temperature}); // no key
}
Run Code Online (Sandbox Code Playgroud)
状态定义如下
this.state = {temperature: '', scale: 'c'};
Run Code Online (Sandbox Code Playgroud)
因此,我期待的不是我一开始所展示的,而是这样的电话:
handleCelsiusChange(temperature) {
this.setState({scale: 'c', temperature: temperature}); // with key
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?(显然有一些自动转换发生)。
附注。temperature只是字符串而不是您从子组件获得的对象,例如
handleChange(e) {
this.props.onTemperatureChange(e.target.value);
}
Run Code Online (Sandbox Code Playgroud) reactjs ×7
javascript ×5
react-hooks ×4
c++ ×1
css ×1
git ×1
github ×1
int ×1
material-ui ×1
mongodb ×1
node.js ×1
react-18 ×1
usecallback ×1