3

我有一个带有 TypeScript v.4.3 的 Vue.js v2.6 项目“幕后”。我的问题:如果在Vue 组件中使用以及如何正确使用它们
有意义,我找不到任何可以清除的文档。 我搜索了文章、Vue.js 文档和 StackOverflow,没有任何发现。(Vue.js 文档完全忽略了它们的存在!)access modifiers

这就是我目前在 Vue 组件中使用访问修饰符的方式:

myComponent.vue 的模板部分:

<template>
  <div>
    <!-- accessing some of the fields of the class here e.g. the getter -->
  </div>
</template>

myComponent.vue 的脚本部分:

<script lang="ts">
  import { Vue, Component, Prop, Emit } from "vue-property-decorator";

  @Component()
  export default class MyComponent extends Vue {
    @Prop() public readonly myPropertyVariable!: boolean;

    public myVariable!: string; // accessed in template

    private myInternalVariable!: boolean; // not accessed in template

    public get myGetterVariable(): string {
       // obviously accessed in template (getter)
    }

    @Emit()
    public change(): void {}

    @Action
    public doAction(): void {}

    public mounted(): void {}

    public myMethod(): boolean {
      // accessed in template
    }

    private myInternalMethod(): boolean {
      // not accessed in template
    }
  }
</script>

我希望,这不是一个基于意见的问题。我假设有一个事实可以证实 Vue 组件中访问修饰符的意义。我有一种强烈的、可能是非理性的抵抗力来忽略它们。

顺便说一句:我在 Rider 中编码,访问修饰符可能对 IDE 代码分析有用。

4

4 回答 4

1

如果它像 Angular 一样工作,您在代码中注释的公共修饰符将确保您的模板可以调用这些公共函数。

也许正如其他开发人员所说,在@refs 的用例中。(虽然如果你需要它们,你很有可能是意大利面条编码)

将方法标记为私有只是说“这不属于模板”的一种方式。

在这些类是强制的“前端场景”中,访问器的使用只会增加可读性(和混乱:D)

这个问题在其他线程中没有得到回答,主要是因为它是常识和风格,而我的 2 美分是,当您不想针对模板时使用 private ,只是为了增加代码的可读性。

作为旁注,我已经使用 vue 和 typescript 3 年了,我可以告诉你的一件事是,我总是发现 vue 类组件过时软件,尤其是在 vue3 中。Vue2 和 3 支持出色的打字稿,无需任何类组件。

于 2021-08-12T17:20:30.127 回答
0

我在我的项目中发现,公共/私有访问修饰符仅在您的组件被其他组件引用时才有用(例如,使用@Ref属性装饰器)

于 2021-08-04T13:12:25.383 回答
0

TypeScript 的public/private访问修饰符不会影响转译的输出,因此在 Vue 的生态系统中没有影响。您仍然可以使用它们,但它们只会在开发过程中通过提供属性访问错误来提供帮助。

请参阅:对 Vue.js 的 TypeScript 支持

此扩展特定于 VSCode,但似乎与您正在寻找的内容一致:https ://github.com/prograhammer/vscode-tslint-vue

于 2021-08-18T00:34:16.887 回答
-1

当您想要对可以访问的内容和不能访问的内容进行逻辑分离时,可以使用公共/私有修饰符。例如,在面向对象编程中,我们将对象的属性声明为私有,因为您永远不会直接访问这些属性。相反,您执行一个操作来修改或访问这些属性。这只是一个旧的编程范式。

我给我的学生举的例子是考虑一个现实世界的物体。以铅笔为例。我们定义它的属性并说好吧,铅笔有长度、锐度和颜色。

这些属性中的每一个,长度、锐度和颜色,都将以修饰符private开头,因为我们永远无法神奇地更改这些属性。如果我们将它们设为公共属性,我们可以这样做:

pencil.color = "blue";

突然我们的铅笔是蓝色的。但我们不知道我们是如何来到这里的,也不知道为什么。这是自发的铅笔颜色变化。我们忽略了达到这一点所需的过程或功能或方法。

因此,在一个非常基本的层面上,我们获取或设置铅笔的颜色。这是另一个古老的面向对象范例,阅读:getter 和 setter(这是一个完全不同的讨论)。然后这些函数将被声明为公共的,因为它们代表了对象可以执行或已经执行的操作。这样,如果您想在代码中的其他位置将所有铅笔都涂成蓝色,您可以这样做:

List<Pencil> my_pencils = pencilFairy.producePencils();
    for(Pencil p : my_pencils){
        p.paint("Blue");    
    }

这样,对于我们称之为 p 的每一支铅笔,在我们的铅笔(我们从 pencilFairy 最近的产品中获得)中,我们想要将铅笔涂成蓝色。在 Pencil 类中,定义如何绘制铅笔所需的逻辑将被定义。

TLDR;您使用 private 来定义某些东西的属性,因为该对象之外的东西不应该能够神秘地和神奇地修改这些属性,并且您使用 public 来定义可以在该对象上/由/对该对象执行的函数或方法,以及这些操作可以修改这些属性或根据这些属性返回一些其他信息等。

编辑:重读这个问题,我相信你已经知道了大部分。只是提供我对如何决定何时何地应该公开/私有的热门看法。

于 2021-08-17T20:52:45.670 回答