小编J. *_*now的帖子

使用“useReducer”时如何添加副作用?

我想知道如果在使用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应该是纯的)

reactjs

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

为什么OkHttp不重用其连接?

我正在使用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有什么问题.

benchmarking http okhttp

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

Electron+Webpack = 找不到模块:错误:无法解析 chokidar/etc 中的 fsevents/fs/etc

我正在尝试创建一个 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)

webpack electron

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

组件渲染了两次吗?是codesandbox的问题吗?

这是我的简单 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

看起来组件已经渲染了两次,但是为什么useMemouseEffect没有被第二次调用?id怎么变成1了?

javascript reactjs codesandbox

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