是否可以从JS中的类中提取类方法?请原谅,我是函数型范式,所以使用React迫使我使用类和this
关键字(无论如何,到目前为止)。我的一些组件越来越大,我不想这样。
我在谷歌上找不到任何关于拉出方法或模块化类的内容。
有没有办法让我说">从'获取此方法/"some_method.js"并使用它,就好像它是在这个文件中声明的一样&class";没有太多侵入性变化?
如果做不到这一点,我假设让它们都起作用,并将this
传递给它们。然而,这感觉相当肮脏。
我希望能为我需要查看的关键词提供一些指导,或者简单地说,如何将方法移出,这样我就不会有2000行文件需要20分钟才能找到
toggleFullMenu() {
this.setState({ menuOpen: !this.state.menuOpen})
}
而不按CTRL+F。这就是我的动力。
我也想知道是否有任何关于构造函数的专业提示。类继承范式的人有什么警告吗?我只是想让这些方法单独放在不同的文件中,但我不知道我在寻找什么。我从没见过有人谈论这个。
编辑,我刚刚在MDN:中发现了这个
使用扩展的子类
extends关键字在类声明或类表达式中用于将类创建为另一个类的子级。
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
class Dog extends Animal {
speak() {
console.log(this.name + ' barks.');
}
}
这是我需要的吗?我该如何着手引入一堆扩展?不过,我不想上儿童课,这听起来不像我所描述的那样。
您可以使用Function.prototype.bind
来执行此操作,这样您就可以控制this
的值。
在一个模块中,您可以将"方法"导出为常规函数:
// methods.js
export const toggleFullMenu = () => {
this.setState({ menuOpen: !this.state.menuOpen })
}
在您的组件模块中:
import React from 'react'
import { toggleFullMenu } from './methods'
class SomeComponent extends React.Component {
constructor () {
super()
this.toggleFullMenu = toggleFullMenu.bind(this)
}
render () {
return <button onClick={this.toggleFullMenu}>Click Me</button>
}
}
toggleFullMenu
函数也可以绑定到其他上下文,因此您实际上可以在不同的组件之间共享该方法。
EDIT:有很多不同的方法可以绑定函数的上下文,但不限于Function.prototype.bind
。请参阅本章,了解各种方法的解释。
我可以说是的,您可以从组件中创建的其他类或文件中提取不同的方法。有很多不同的方法,这真的取决于你的喜好。你可以从非常简单的结构发展到非常复杂的结构。
首先,您需要搜索并了解(如果您还不知道)require()
和/或ES6导入和导出。您可以创建独立的函数或对象,并将它们导入到组件中以使用它们。如果你在应用程序的不同组件或部分中使用重复功能,这就是你的选择。
如果我评论将this
作为参数传递,它与您在问题中所说的不太一样。与其传递this
,不如将所需参数传递给函数并使用回调或Promises。您可以使用的另一种技术是将bind
函数转换为this
。ES6箭头函数不需要是bind
,因为它们不绑定自己的this
。
如果你想稍微复杂一点,你可以创建自己的类。类结构可以提供做更复杂事情的能力。extends
使您能够用其他方法扩展(正如您从其名称中可以理解的那样)您的类方法,或者用新方法覆盖它们。例如,饮料、零食、肉类可以是从食品类扩展而来的类。当你创建一个自定义组件时,你扩展了一个React.component,然后你使用它的方法。
另一件需要考虑的事情是,拥有一个2000行的组件让我认为您还应该考虑将组件分成更小的块。父/子组件关系是React中最常见和最受支持的结构。如果你使用这种模式,你的代码会自动变小,并且更容易遵循和管理。关于如何将函数作为道具传递给子组件,并在特定条件下使用特定参数运行它们,然后操纵父组件的状态,有很多例子。你可以找那些例子来更好地理解。
我希望这些话题能帮助你们理解一些事情,并告诉你们从哪里开始。
Webpack是一个功能齐全的javascript应用程序bundler。使用Webpack,您可以导入/导出代码,如:
export default class CustomerView {
render() {
...
}
}
和
import CustomerView from './CustomerView'
`