VUE06

1,在vue事件中传入$event,使用e.target和e.currentTarget有什么区别吗?

这个问题我觉得还是比较重要的,因为我们只要做过vue项目,基本会遇到这个问题。然而很多人是随便用,感觉都差不多,其实他们是有本质区别的,一旦没用好,随之扑面而来的就是bug。

用概念区分:
event.currentTarget始终指向事件所绑定的元素,而event.target指向事件发生时的元素。

从上面的结果可以看出,不管你点击的是a本身或者a里面任何子集,currentTarget其获取到的对象都为绑定事件的a;当使用target时,如果你点击到a元素则传a元素,如果点击到a之中的某个子级元素则传a之中的某个元素。
一句话,target会变,点到谁身上返回谁,currentTarget不会变,返回事件源对象。另外要强调一个问题,在我们直接打印例如:console.log(e)时候,你会发现控制台打印出来的currentTarget是null,有些同学可能一时就慌神了,具体原因我也没找到确切答案,但你打印e.currentTarget你会发现,这个值是肯定会存在的。

2.在.vue文件里style是必须的嘛?那script呢?为什么?

都不是必须的,不过得分情况

一、.html文件

可以都没有,那就是一个静态文件

二、.vue文件

1、如果没有render函数,那么template是必须要有的,否则报错
2、如果有render函数,那么可以没有template,style,但是要有script
3、可以只有,而script、style是非必须的

三、.js文件

直接tempalte、script、style都可以没有,也能够做组件!!!
只需如下即可

export default { props: [ 'title' ], render(createElement) { return createElement('h1', {}, 'Hello World') } }

3.Vue怎么实现强制刷新组件?

使用vue进行开发时,如果要刷新当前路由,则调用router.go(0)方法即可。但是某些情况下,我们可能要求仅仅刷新某个组件,而不是路由,那么我们应该怎么做呢?

1.使用this.$forceUpdate强制重新渲染
如果要在组件内部中进行强制刷新,则可以调用this.$forceUpdate()强制重新渲染组件,从而达到更新目的。

<template>
<button @click="reload()">刷新当前组件</button>
</template>
<script>
export default {
    name: 'comp',
    methods: {
        reload() {
            this.$forceUpdate()
        }
    }
}
</script>

2.使用v-if指令
如果是刷新某个子组件,则可以通过v-if指令实现。我们知道,当v-if的值发生变化时,组件都会被重新渲染一遍。因此,利用v-if指令的特性,可以达到强制刷新组件的目的。

<template>
    <comp v-if="update"></comp>
    <button @click="reload()">刷新comp组件</button>
</template>
<script>
import comp from '@/views/comp.vue'
export default {
    name: 'parentComp',
    data() {
        return {
            update: true
        }
    },
    methods: {
        reload() {
            // 移除组件
            this.update = false
            // 在组件移除后,重新渲染组件
            // this.$nextTick可实现在DOM 状态更新后,执行传入的方法。
            this.$nextTick(() => {
                this.update = true
            })
        }
    }
}
</script>

4,Vue自定义事件中父组件怎么接收子组件的多个参数?

遇到一种情况,接收子组件传来的参数的同时,还想将父组件本身参数传进事件中,找到以下解决方法

1 子组件传出单个参数时:

// 子组件
this.$emit('test',this.param)
// 父组件
@test='test($event,userDefined)'
  1. 子组件传出多个参数时:
// 子组件
this.$emit('test',this.param1,this.param2, this.param3)
// 父组件 arguments 是以数组的形式传入
@test='test(arguments,userDefined)'

5.实际工作中,你总结的vue最佳实践有哪些?

1.始终在 v-for 中使用 :key
在需要操纵数据时,将key属性与v-for指令一起使用可以让程序保持恒定且可预测。

这是很有必要的,这样Vue就可以跟踪组件状态,并对不同的元素有一个常量引用。在使用动画或Vue转换时,key 非常有用。

如果没有key ,Vue只会尝试使DOM尽可能高效。 这可能意味着v-for中的元素可能会出现乱序,或者它们的行为难以预测。 如果我们对每个元素都有唯一的键引用,那么我们可以更好地预测Vue应用程序将如何精确地处理DOM操作。

**2.在事件中使用短横线命名** 在发出定制事件时,最好使用短横线命名,这是因为在父组件中,我们使用相同的语法来侦听该事件。

因此,为了确保我们各组件之间的一致性,并使您的代码更具可读性,请在两个地方都坚持使用短横线命名。

this.$emit('close-window')
// 在父组件中
<popup-window @close-window='handleEvent()' />

3.使用驼峰式声明 props,并在模板中使用短横线命名来访问 props
最佳做法只是遵循每种语言的约定。 在 JS 中,驼峰式声明是标准,在HTML中,是短横线命名。 因此,我们相应地使用它们。

幸运的是,Vue 已经提供了驼峰式声明和短横线命名之间转换,因此除了实际声明它们之外,我们不必担心任何事情。

// 不好的做法
<PopupWindow titleText='hello world' /> 
props: { 'title-text': String }

// 好的做法
<PopupWindow title-text='hello world' /> 
props: { titleText: String }

4.data 应始终返回一个函数
声明组件data时,data选项应始终返回一个函数。 如果返回的是一个对象,那么该data将在组件的所有实例之间共享。

// 不好的做法
data: {
  name: 'My Window',
  articles: []
}

但是,大多数情况下,我们的目标是构建可重用的组件,因此我们希望每个组件返回一个惟一的对象。我们通过在函数中返回数据对象来实现这一点。

// 好的做法
data () {
  return {
    name: 'My Window',
    articles: []
  }
}

5. 不要在同个元素上同时使用v-if和v-for指令
为了过滤数组中的元素,我们很容易将v-if与v-for在同个元素同时使用。

// 不好的做法
<div v-for='product in products' v-if='product.price < 500'>

问题是在 Vue 优先使用v-for指令,而不是v-if指令。它循环遍历每个元素,然后检查v-if条件。

this.products.map(function (product) {
  if (product.price < 500) {
    return product
  }
})

这意味着,即使我们只想渲染列表中的几个元素,也必须遍历整个数组。

这对我们来当然没有任何好处。

一个更聪明的解决方案是遍历一个计算属性,可以把上面的例子重构成下面这样的:

<div v-for='product in cheapProducts'>
 
computed: {
  cheapProducts: () => {
    return this.products.filter(function (product) {
      return product.price < 100
    })
  }
}

这么做有几个好处:

渲染效率更高,因为我们不会遍历所有元素
仅当依赖项更改时,才会重使用过滤后的列表
这写法有助于将组件逻辑从模板中分离出来,使组件更具可读性

6.用正确的定义验证我们的 props
可以这条是很重要,为什么?

在设计大型项目时,很容易忘记用于props的确切格式、类型和其他约定。如果你在一个更大的开发团队中,你的同事不会读心术,所以你要清楚地告诉他们如何使用你的组件。

因此,我们只需编写props验证即可,不必费力地跟踪组件来确定props的格式

从Vue文档中查看此示例。

props: {
  status: {
    type: String,
    required: true,
    validator: function (value) {
      return [
        'syncing',
        'synced',
        'version-conflict',
        'error'
      ].indexOf(value) !== -1
    }
  }
}

7.组件全名使用驼峰或或者短横线

组件的通用命名约定是使用驼峰或短横线。无论我们使用哪咱,最重要的是始终保持一致。我认为驼峰方式 效果最好,因为大多数IDE自动完成功能都支持它。

# 不好的做法

mycomponent.vue
myComponent.vue
Mycomponent.vue

# 好做法

MyComponent.vue

8. 基本组件应该相应地加上前缀

根据Vue样式指南,基本组件是仅包含以下内容的组件:

HTML 元素
额外的基础组件
第三方的UI组件
为这些组件命名的最佳实践是为它们提供前缀Base、V或App。同样,只要我们在整个项目中保持一致,可以使用其中任何一种。

BaseButton.vue
BaseIcon.vue
BaseHeading.vue

该命名约定的目的是使基本组件按字母顺序分组在文件系统中。 另外,通过使用webpack导入功能,我们可以搜索与命名约定模式匹配的组件,并将所有组件自动导入为Vue项目中的全局变量。

单实例组件命名应该带有前缀 The
与基本组件类似,单实例组件(每个页面使用一次,不接受任何prop)应该有自己的命名约定。这些组件特定于我们的应用,通常是 footer,header或sider。

该组件只能有一个激活实例。

TheHeader.vue
TheFooter.vue
TheSidebar.vue
ThePopup.vue

10.保持指令简写的一致性

在Vue开发人员中,一种常见的技术是使用指令的简写。例如:

@是v-on的简写
: 是 v-bind 的简写
# 是 v-slot 的简写

在你的Vue项目中使用这些缩写是很好的。但是要在整个项目中创建某种约定,总是使用它们或从不使用它们,会使我们的项目更具内聚性和可读性。

11.不要在“created”和“watch”中调用方法
Vue开发人员经常犯的一个错误是他们不必要地在created和watch中调用方法。 其背后的想法是,我们希望在组件初始化后立即运行watch。

created: () {
  this.handleChange()
},
methods: {
  handleChange() {
    // stuff happens
  }
},
watch () {
  property() {
    this.handleChange()
  }
}

但是,Vue为此提供了内置的解决方案,这是我们经常忘记的Vue watch属性。

我们要做的就是稍微重组watch并声明两个属性:

1.handler (newVal, oldVal)-这是我们的watch方法本身。

immediate: true- 代表如果在 wacth 里声明了之后,就会立即先去执行里面的handler方法,如果为 false就跟我们以前的效果一样,不会在绑定的时候就执行

// 好的做法
methods: {
handleChange() {

// stuff happens
}
},
watch () {
property {

immediate: true
handler() {
  this.handleChange()
}
}
}

12. 模板表达式应该只有基本的 JS 表达式
在模板中添加尽可能多的内联功能是很自然的。但是这使得我们的模板不那么具有声明性,而且更加复杂,也让模板会变得非常混乱。

为此,让我们看看Vue样式指南中另一个规范化字符串的示例,看看它有多混乱。

//不好的做法
{{
  fullName.split(' ').map(function (word) {
    return word[0].toUpperCase() + word.slice(1)
  }).join(' ')
}}

基本上,我们希望模板中的所有内容都直观明了。 为了保持这一点,我们应该将复杂的表达式重构为适当命名的组件选项。

分离复杂表达式的另一个好处是可以重用这些值。

// 好的做法
{{ normalizedFullName }}


// The complex expression has been moved to a computed property
computed: {
  normalizedFullName: function () {
    return this.fullName.split(' ').map(function (word) {
      return word[0].toUpperCase() + word.slice(1)
    }).join(' ')
  }
}

总结:
这是12个最常见的最佳实践,它们将使我们的Vue代码更易于维护、可读性更好、更专业。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值