我想知道如果在使用useReducer钩子时需要添加一些副作用,我有哪些选择。
例如,有一个 TODO-app:
const initialState = {items: []};
const reducer = (state, action) => {
switch (action.type) {
case 'ADD':
return {
...state,
items: [...state.items, action.newItem]
};
default:
throw new Error();
}
};
const App = () => {
const [state, dispatch] = useReducer(reducer, initialState);
return (
<button onClick={() => dispatch({ type: 'ADD', newItem: 123 })}>
Add item
</button>
);
}
Run Code Online (Sandbox Code Playgroud)
我需要将新项目保存到服务器。问题是:我应该把这段代码放在哪里?
(记住,reducer应该是纯的)
我正在使用OkHttp 3.5.0执行http基准测试.我向同一个网址发送了数千个请求.
我希望OkHttp-client使用ConnectionPool并一遍又一遍地重用它的连接.但是如果我们调查一下,netstat我们会在TIME_WAIT状态下看到很多连接:
TCP 127.0.0.1:80 127.0.0.1:51752 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51753 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51754 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51755 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51756 TIME_WAIT
...
Run Code Online (Sandbox Code Playgroud)
经过成千上万的请求,我得到了一个 SocketException: No buffer space available (maximum connections reached?)
代码预先形成请求(Kotlin):
val client = OkHttpClient.Builder()
.connectionPool(ConnectionPool(5, 1, TimeUnit.MINUTES))
.build()
val request = Request.Builder().url("http://192.168.0.50").build()
while (true) {
val response = client.newCall(request).execute()
response.close()
}
Run Code Online (Sandbox Code Playgroud)
如果不response.close()使用response.body().string(),那么SocketException不会发生,但netstat仍会显示大量的TIME_WAIT连接,并且基准性能越来越低.
我究竟做错了什么?
PS:我试过使用Apache HttpClient及其PoolingHttpClientConnectionManager,看起来它完美无缺.但我想弄清楚OkHttp有什么问题.
我正在尝试创建一个 Electron 应用程序,但是许多节点库导致Module not found错误,即使是electron-main目标也是如此。
webpack.config.js
const path = require('path')
module.exports = {
mode: 'development',
target: `electron-main`,
entry: {main: `./src/main.js`},
resolve: {
extensions: ['.js'],
modules: ['node_modules', path.join(__dirname, 'src')],
},
output: {
path: path.resolve(__dirname, `dist`),
filename: '[name].bundle.js',
},
}
Run Code Online (Sandbox Code Playgroud)
源代码/main.js
const watcher = require('chokidar').watch('./dist')
watcher.on('change', function() {
console.log('change', arguments)
})
Run Code Online (Sandbox Code Playgroud)
包.json
{
"name": "test",
"version": "1.0.0",
"author": "I",
"private": true,
"main": "dist/main.bundle.js",
"scripts": {
"build": "webpack"
},
"devDependencies": {
"@types/chokidar": "^1.7.5",
"chokidar": "^2.0.4",
"electron": "^2.0.8",
"webpack": "^4.17.1", …Run Code Online (Sandbox Code Playgroud) 这是我的简单 React 应用程序:
let idCounter = 0;
export default function App() {
const id = useMemo(() => {
console.log("useMemo");
return idCounter++;
}, []);
console.log("render", id);
useEffect(() => {
console.log("useEffect", id);
});
return id;
}
Run Code Online (Sandbox Code Playgroud)
https://codesandbox.io/s/morning-bush-swky8
这是控制台输出:
useMemo
render 0
useEffect 1
Run Code Online (Sandbox Code Playgroud)
为什么useEffect id等于1?
看起来组件已经渲染了两次,但是为什么useMemo和useEffect没有被第二次调用?id怎么变成1了?
reactjs ×2
benchmarking ×1
codesandbox ×1
electron ×1
http ×1
javascript ×1
okhttp ×1
webpack ×1