小编Aja*_*aur的帖子

浅层比较如何起作用

在React的这个文档中,据说

shallowCompare对当前props和nextProps对象以及当前state和nextState对象执行浅等式检查.

我无法理解的事情是If It浅层比较对象,那么shouldComponentUpdate方法将始终返回true,如

我们不应该改变国家.

如果我们没有改变状态,那么比较将始终返回false,因此shouldComponent更新将始终返回true.我很困惑它是如何工作的,我们将如何覆盖它以提高性能.

javascript reactjs

74
推荐指数
6
解决办法
4万
查看次数

箭头函数语法不能与webpack一起使用?

我正在使用react-redux创建应用程序.我正在使用webpack进行捆绑和babel进行转换.当我尝试在我的代码中使用箭头功能.它给我的错误是:

Module build failed: SyntaxError: Unexpected token (34:15)

};

> handleSubmit = (event) => {
                  ^
  event.preventDefault();

  this.props.dispatch(actions.addTodo(this.state.inputText));
Run Code Online (Sandbox Code Playgroud)

我的webpack配置文件如下所示:

module.exports = {
  devtool: 'inline-source-map',
  entry: [
    'webpack-hot-middleware/client',
    './client/client.js'
  ],
  output: {
    path: require('path').resolve('./dist'),
    filename: 'bundle.js',
    publicPath: '/'
  },
  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module: {
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['react', 'es2015', 'react-hmre']
        }
      }
    ]
  }
};
Run Code Online (Sandbox Code Playgroud)

我在package.json中使用以下babel包:

 "babel-cli": "^6.6.5",
"babel-core": "^6.4.5",
"babel-loader": "^6.2.2",
"babel-preset-es2015": "^6.3.13",
"babel-preset-react": "^6.3.13", …
Run Code Online (Sandbox Code Playgroud)

javascript webpack babeljs

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

我可以在React中调用componentWillMount中的API吗?

我正在努力做最后一年的反应.我们遵循的约定是componentDidMount在数据到来之后进行API调用,获取数据和setState.这将确保组件已安装,并且设置状态将导致重新呈现组件但我想知道为什么我们不能setState componentWillMountconstructor

官方文件说:

在安装发生之前立即调用componentWillMount().它在render()之前调用,因此在此方法中设置状态不会触发重新呈现.避免在此方法中引入任何副作用或订阅.

它说setting state in this method will not trigger a re-rendering,在进行API调用时我不想要它.如果我能够获取数据并且能够设置状态(假设API调用真的很快)in componentWillMount或in constructor并且数据存在于第一个渲染中,为什么我要重新渲染呢?

如果API调用很慢,那么setState将是异步并且componentWillMount已经返回然后我将能够setState并且应该发生重新渲染.

总的来说,我很困惑为什么我们不应该在构造函数或componentWillMount中进行API调用.在这种情况下,有人能真正帮助我理解反应是如何起作用的吗?

javascript reactjs

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

如何在React应用程序中的typescript文件中导入js模块(带绝对路径)?

我正在我的React应用程序中集成typescript,它有大量的代码.我有一些应用程序级别的HOC,我将其应用于React组件:

import React from 'react';
import HOC1 from 'app/hocs/hoc1';
import compose from 'recompose/compose;

class MyComponent from React.Component {
     ...component stuff...
}

export default compose(HOC1())(MyComponent);
Run Code Online (Sandbox Code Playgroud)

但是现在我在我的应用程序中添加了typescript,每当我导入时

import HOC1 from 'app/hocs/hoc1';
Run Code Online (Sandbox Code Playgroud)

它说

TS2307: Cannot find module 'app/hocs/hoc1'.
Run Code Online (Sandbox Code Playgroud)

我不想为所有HOC添加类型定义.什么是解决方案以及为什么我收到此错误?

[编辑]我使用baseUrltsconfig为好.我的文件夹结构是

/Project/configs/tsconfig
/Project/src/app/hocs
Run Code Online (Sandbox Code Playgroud)

在tsconfig,我已经给了baseUrl../src通过文档.

另一个Edit 和我的webpack配置看起来像:

    {
        test: /\.(t|j)sx?$/,
        loader: 'happypack/loader?id=jsx-without-proptypes',
        include: [
          path.resolve(__dirname),
          path.resolve(__dirname, '../src'),
        ],
      },
Run Code Online (Sandbox Code Playgroud)

整个webpack配置看起来像

const config = {
  context: path.resolve(__dirname, '../src'),

  mode: NODE_ENV,

  optimization: {
    splitChunks: false,
    nodeEnv: …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs webpack

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

什么是事件汇集反应?

SyntheticEvent汇集在一起​​.这意味着将重用SyntheticEvent对象,并且在调用事件回调后,所有属性都将无效.这是出于性能原因.因此,您无法以异步方式访问事件.

参考:React中的事件系统

javascript reactjs

8
推荐指数
3
解决办法
4341
查看次数

从运行流中无限多个元素的数组返回最大k个元素的最优算法

我有一个正在运行的整数流,如何在任何时间点从该流中获取最大的k个元素.

arrays algorithm stream data-structures

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

如何用withHandlers,branch和withState重组酶来测试处理程序?

我是酶测试的新手,我已经制作了一个组件:

import React from 'react';
import {
  compose,
  withState,
  withHandlers,
  branch,
  pure,
  renderComponent,
} from 'recompose';

import Fields from './components/Fields';
import Flow from './components/Flow';

export const MODE = {
  preview: 'preview',
  edit: 'edit',
};

const inEditMode = ({ mode }) => mode === MODE.edit;

const Component = branch(
  inEditMode,
  renderComponent(Fields),
  renderComponent(Flow),
)(Flow);

const Tab = pure(props => <Component {...props} />);

export default compose(
  withState('mode', 'changeMode', props => {
    const path = props.path;

    return props.path ? MODE.preview : MODE.edit;
  }),
  withHandlers({ …
Run Code Online (Sandbox Code Playgroud)

reactjs jestjs enzyme recompose

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

如何有条件地测试 componentDidMount 进行 API 调用

我在我的应用程序中使用 React。我正在调用 API,componentDidMount但它是有条件的。我在组件中的代码是

componentDidMount() {
    if (!this.props.fetch) {
      fetchAPICall()
        .then(() => {
          /** Do something **/
        });
    }
  }
Run Code Online (Sandbox Code Playgroud)

我已经写了测试:

it('should not fetch ', () => {
      const TFCRender = mount(<Component fetch />);
      const didMountSpy = jest.spyOn(TFCRender.prototype, 'componentDidMount');
      expect(didMountSpy).toHaveBeenCalledTimes(1);
      expect(fetchAPICall).toHaveBeenCalledTimes(0);
    });
Run Code Online (Sandbox Code Playgroud)

测试抛出了我的错误

TypeError: Cannot read property 'componentDidMount' of undefined
Run Code Online (Sandbox Code Playgroud)

我做错了什么,测试这种情况的正确方法是什么。

javascript reactjs jestjs enzyme

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

如何使用 jest 为使用 uuid 的函数编写测试用例?

我正在使用jest编写测试用例。我的一个函数使用uuid,因此它不是纯函数。代码是这样的:

const myFunc = () => {
    const a = uuid();

    return a;
}
Run Code Online (Sandbox Code Playgroud)

我正在编写我的测试用例:

test('should return a unique id value', () => {
    const a = uuid();
    expect(myFunc()).toEqual(a);
});
Run Code Online (Sandbox Code Playgroud)

显然它不会工作,因为它每次都会生成一个唯一的 ID。如何为此类功能编写测试用例。

[编辑]

我不想测试这个uuid函数,因为它总是会生成一个新的 id,而且它是一个已经在测试中的库函数。我想测试另一个使用uuid、生成新对象并返回该对象的函数。这个函数被其他一些函数使用等等,这使我无法测试任何一个,因为初始对象的 id 与我在测试时使用的 id 不同。

javascript reactjs jestjs enzyme

4
推荐指数
2
解决办法
4844
查看次数

我如何在DOM主体中呈现组件,即使其他一些组件在React中呈现它呢?

我有一个组件,例如X由我app和DOM主体呈现的一个组件。我有另一个Y由该组件呈现的组件,X但该组件Y应在全屏模式下打开。因此,即使渲染它,我也需要在document.body内部组件中渲染它。XX

React Components的结构为:

app
    -X
         -Y (in Full Screen)
Run Code Online (Sandbox Code Playgroud)

现在的结构应如下所示:

<body>
    <div class="X">
         <div class="Y">
         </div>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

呈现的流应为:

app.body
    -X
-Y
Run Code Online (Sandbox Code Playgroud)

DOM结构应为:

<body>
    <div class="X">
    </div>
    <div class="Y">
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点。另外,我正在使用ES6类来制作react-components。

javascript reactjs

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