繁体   English   中英

React 跨组件共享方法

[英]React sharing method across components

到目前为止,我有一个看起来像这样的组件:

import React from 'react';

// Import images
import logo from '../images/logo-small.png';

class LoginForm extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            email: '',
            password: '',
        };

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    handleChange(e) {
        const target = e.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        this.setState({
            [name]: value
        });
    }

我将在我的应用程序的多个文件中的多个组件中重复使用相同的handleChange(e)方法。 有没有办法可以分离出这个方法,而不必每次都重写它?

我是否会将handleChange(e)放入文件名utils.js并在每次需要使用它时导入该文件? 如果是这样,我如何确保this.setState正常工作?

我对如何解决这个问题有一些粗略的想法(例如上面的那个),但我想采取最好的方法来解决这个问题。 谢谢!

Hooks是另一种方式。

使用自定义钩子,您可以轻松地在组件之间重用状态相关处理程序。

// hooks.js
const { useState } from 'react';

const useHandleChange = () => {
  const [formValues, setFormValues] = useState({});

  const handleChange = (e) => {
    const { type, checked, name, value} = e.target;
    const value = type === 'checkbox' ? checked : value;
    const name = name;

    setFormValues({
      [name]: value
    });
  };

  return { formValues, handleChange };
}

// Component.js
import useHandleChange from './hooks';

const LoginForm = () => {
  // you can use that on each component that needs the handleChange function
  const { formValues, handleChange } = useHandleChange();

  return (
    // html template
  );
};

您需要将您的组件转换为功能 component ,但因此只有在不需要太多努力来重构您的代码时,我才会提出此解决方案。 Hooks 不适用于类组件。

当然。 您正在寻找的是所谓的高阶组件

您可以使用您需要共享的所有方法/逻辑创建一个 HOC,并用它包装您需要增强的组件。

你当然可以创建一个辅助函数。 但是,在保存状态的组件中使用setState()很好。

为此,您可以执行以下操作:

// utils.js helper function
handleCheckbox(e) {
  const target = e.target,
        value = target.type === 'checkbox' ? target.checked : target.value;
  return {name: target.name, value: value};
}


// In your component
handleChange(e) {
  // Destructured in case you need to handle it differently
  const { name, value } = handleCheckbox(e);
  this.setState({[name]: value});
}

助手可以传递{[name]: value} ,但它不一定要关心变量最终是如何使用的。

我想只需创建新文件,例如utils.jsutils.js导出您的函数,如下所示

const handleChange = (e) => {
        const target = e.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name;

        return { [name]: value }
}

export.handler = handleChange;

而不是将其导入到您的文件中,例如像这样:

const utils = require('path/to/file');

setState(utils.handleChange(e));

快乐编码!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM