1、根实例问题

vue中的根实例可以有多个,每个根实例可以挂载DOM元素,只有在挂载的DOM元素上才可以使用该实例中的数据方法等。

并且,组件只有在某一个根实例所挂载的DOM元素上才可以使用。

2、组件的data选项

一个组件的 data 选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝。组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data。如果data值为对象,将导致多个实例共享一个对象,其中一个组件改变data属性值,其它实例也会受到影响。

3、vue-cli初始运行项目报错

安装vue-cli:直接npm i vue-cli -g,然后直接vue init webpack projectname,然后进入目录,npm run dev即可,如果报错:Module build failed: Error: "extract-text-webpack-plugin" loader is used without the corresponding plugin, refer to https://github.com/webpack/extract-text-webpack-plugin for the usage example,解决方法如下:

在 webpack.dev.conf.js 中添加 extract-text-webpack-plugin 配置如下

const ExtractTextPlugin = require('extract-text-webpack-plugin')

........

plugins: [
.............
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// set the following option to `true` if you want to extract CSS from
// codesplit chunks into this main css file as well.
// This will result in *all* of your app's CSS being loaded upfront.
allChunks: false,
}),
]

参照:https://my.oschina.net/dkvirus/blog/1583258

4、命名问题

4.1、自定义事件命名

vue 中的自定义事件在被触发时(子组件触发父组件的自定义事件),驼峰法和横线法不会进行自动转换即不会自动匹配,所以事件名需要完全一致。并且在DOM中的事件名都会被转换为小写,所以如果你在 JS 代码中如果使用了驼峰法,而 DOM 中也使用了驼峰法,则会匹配不上而报错。

所以事件命名推荐使用横线连接符(kebab-case)而不是驼峰命名法(camelCase )。

4.2、prop的命名

在DOM中即父组件使用中使用横线连接符(kebab-case)命名,在子组件中可以使用横线或者驼峰法,都能匹配上。

推荐使用横线连接符命名

4.3、组件的命名

组件的命名可以使用分隔线或者首字母大写的驼峰法。

当使用分隔线命名时(比如:my-component-name),使用组件的时候也得使用分隔线;

当使用首字母大写的驼峰法时(比如:MyComponentName),在使用组件时可以使用分隔线也可以使用首字母大写驼峰法。但是当直接在 DOM 中使用时,此时应该使用分隔线,因为在 HTML 中不区分大小写,所以在HTML中使用驼峰法可能会因为匹配不上而报错。

推荐使用横线连接符命名

5、 语法糖

语法糖是指用另一种语法替换原先的比较复杂的语法,但实现的功能一样,这种比较简单清晰的语法被称为语法糖。

vue 中的语法糖有:

  1. v-bind 的语法糖是:":"
  2. v-on 的语法糖是:"@"
  3. v-model 也是一个语法糖,v-model = "test" 的实际写法可以写成 :value = "test" @input = " test =  $event.target.value "
  4. v-slot 的语法糖是:"#",该缩写只有在有参数时才能用,比如具名插槽:<template #header>  </template>

6、组件中的 name 属性的作用

组件中是有 name 属性的,组件的 name 属性主要有以下几个作用:

6.1、允许组件递归地引用本身

在自身组件调用自身的时候,可以通过定义name的值进行递归调用

<div>
<div v-for="(item,index) of list" :key="index">
<detail-list></detail-list>
</div>
</div> export default {
name: 'DetailList', //组件可以利用 name 属性递归地调用本身
props: {
list: [1,2,3]
}
}

6.2、使用 keep-alive 缓存组件

<!-- 失活的组件将会被缓存!-->
// 下面的 is 后面的名字应该是组件的 name 属性值
<keep-alive>
<component v-bind:is="currentTabComponent"></component>
</keep-alive>

组件在全局用 Vue.component() 注册时,全局 ID 自动作为组件的 name。

<keep-alive> 要求被切换到的组件都有自己的名字,不论是通过组件的 name选项还是局部/全局注册。

6.3、报错警告信息明确,使用 vue-devtools 开发更易于调试

指定 name 选项的另一个好处是便于调试,有名字的组件有更友好的警告信息。

另外,当在有 vue-devtools,未命名组件将显示成 <AnonymousComponent>,这很没有语义。如果组件有 name 属性,那在 vue-devtools 中显示的将是 name 的值,组件树更有语义。

7、Vue 中的字符串模板和DOM模板

Vue 中的字符串模板指的应该是包括在引号 ' ' 或者双引号 " " 之间的,包括在这之间时可以使用一切 JS 表达式,而不用拘泥于大小写问题。

而 DOM 模板就是非字符串模板,指的是在 HTML 内的,而且没有在引号之间。

8、关于父子组件props传值的响应式修改问题

父子组件之间可以通过 props 进行传值,在父组件中修改传过去的值时,在子组件中接收到的 props 值都会随之发生改变。但是如果把 props 的值赋值给 data 中的数据时,data 中的数据不一定会随之改变。

当 props 值不是对象时,直接赋值给 data 属性,data 属性不会发生响应式改变。比如当 props 值是对象时,如果直接赋值给 data 属性,data 属性会发生响应式改变,如果将对象的某个属性或者直接将某个基本类型值赋值给 data 属性,此时子组件中该 data 属性不会发生响应式改变。

总而言之,将对象赋值给 data 属性会随之发生改变,将基本类型值赋值给 data 属性则不会发生响应式改变。

//父组件 parent.vue
<button @click="editName">点击修改数据</button>
<item01 :name-prop="name" :human-prop="human" /> data() {
return {
name: 'wen',
human: {name: '人类'}
}
},
methods: {
editName () { //点击修改传过去的 props 值
this.name = 'hai'
this.human.name = '动物'
}
} //子组件 child.vue
props: ['nameProp','humanProp'], //props值会响应式地发生改变
data() {
return {
myName: this.nameProp, //不是对象的值直接赋值给 data 属性,此时不会发生响应式改变
myHuman: this.humanProp //对象直接赋值给 data 属性,会发生响应式改变
myHumanName: this.humanProp.name //对象属性赋值给 data 属性,也不会发生响应式改变
}
} {{nameProp}} -- {{humanProp}} //props值 都会响应式地发生改变
{{myName}} //data属性 此时不会改变
{{myHuman.name}} //这里会改变
{{myHumanName}}     //这里不会改变

请注意:是子组件中的 data 属性的数据不会发生响应式改变,但 props 属性的值都是会响应式改变的。所以如果你不需要修改传过来的值的话,你也可以直接用 props 属性的值,而不用赋值给 data 中的属性值。

8.1、如何解决子组件接收的基本值类型的数据时不会发生响应式改变的问题

上面说到如果将值类型的 props 值赋值给 data 属性时,data 属性不会随着父组件的数据的改变而发生改变,要想解决这个问题,可以通过监听 props 的值,当 props 的某个值发生改变时,再将其赋值给 data 属性。

//子组件 child.vue
{{myName}} //此时会发生响应式改变 props: ['name','human'], //props值会响应式地发生改变
data() {
return {
myName: this.name, //不是对象的值直接赋值给 data 属性,此时不会发生响应式改变
}
},
watch: {
name (newVal, oldVal) { //通过监听将新的props值赋值给data属性
this.myName = newVal;  //或者: this.myName = this.name
}
}

当然,如果不需要修改传递过来的值时,你也可以直接使用接收的 prop 的值进行操作,而无需赋值给组件的 data,这样就不用监听改变了。

vue使用中的问题总结的更多相关文章

  1. vue使用中的随笔

    在vue中vue-router配置的路径默认有"#"号,虽然无伤大雅,但是很多客户都不想看到,所以在初始配置路由的时候加上下面一句代码就可以了 mode:'history', 路径 ...

  2. vue使用中遇到的,以及vue1.0到vue2.0新手踩的坑

    最近再写一个vue的项目,视频中用的是vue1.0,但是现在vue已经2.0,所以踩了很多坑,先记录下来.理解有误再来修改. 路由问题 之前的路由是写在app.vue里边,而2.0的路由直接有个rou ...

  3. Vue 使用中的小技巧

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...

  4. Vue使用中遇到问题汇总(三)

    1.后台session过期前端跳转到登录页面 axios 拦截器 可以拦截请求和返回,对于失效的情况后端可以返回一个状态码,如401, 使用axios拦截时判断是401,则跳转到指定页面,如login ...

  5. Vue 使用中的小技巧(山东数漫江湖)

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...

  6. Vue使用中遇到问题汇总(二)

    1.vue cli使用npm run dev报错cannot get / config/index.js里有两个环境:一个是build,一个dev. 在config/index.js里面修改,buil ...

  7. Vue使用中遇到问题汇总(一)32个

    1.安装一些需要编译的包:提示没有安装python.build失败等 因为一些 npm 的包安装需要编译的环境,mac 和 linux 都还好,大多都齐全 .window 用户依赖 visual st ...

  8. VUE 使用中踩过的坑

    vue如今可谓是一匹黑马,github star数已居第一位!前端开发对于vue的使用已经越来越多,它的优点就不做介绍了,本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结,帮助大 ...

  9. VUE使用中踩过的坑

    前言 vue如今可谓是一匹黑马,github star数已居第一位!前端开发对于vue的使用已经越来越多,它的优点就不做介绍了,本篇是我对vue使用过程中以及对一些社区朋友提问我的问题中做的一些总结, ...

随机推荐

  1. gradle自动化打包apk

    前堤是要在安卓项目中配置好gradle.build脚本 ## !/bin/sh ## 项目名 ##使配置文件生效,否则会报gradle:命令找不到 source /etc/profile TARGET ...

  2. 下载 GitHub 上保存在 AWS 的文件

    通过 GitHub 下载文件时,发现很多文件保存在亚马逊的 AWS 上.而国内访问 AWS 的速度很慢,经常会有文件下载失败.常用的解决方案是挂代理,但我这边挂了代理还是很慢,只好找其他办法. AWS ...

  3. CentOS防火墙命令集

    1. firewalld的基本使用 启动防火墙: systemctl start firewalld 防火墙状态: systemctl status firewalld 停止防火墙: systemct ...

  4. ELK+Filebeat (1)

    1 Filebeat介绍 Filebeat是Beat成员之一,基于Go语言,无任何依赖,并且比logstash更加轻量,非常适合安装在生产机器上,不会带来过高的资源占用,轻量意味着简单,所以Fileb ...

  5. 《STL源码剖析》——第四章、序列容器

     1.容器的概观与分类 所谓序列式容器,其中的元素都可序(ordered)[比如可以使用sort进行排序],但未必有序(sorted).C++语言本身提供了一个序列式容器array,STL另外再提供v ...

  6. deepin修改默认Python2到Python3

    第一步 打开终端 第二步 输入 sudo vi ~/.bashrc 然后你会看到如下界面: 切大写,输入E,进入如下界面,并在最后输入我已经输入的 alias python='python3' ,记住 ...

  7. let/const及块级作用域

    本系列是在平时阅读.学习.实际项目中有关于es6中的新特性.用发的简单总结,目的是记录以备日后温习:本系列预计包含let/const.箭头函数.解构.常用新增方法.Symbol.Set&Map ...

  8. deque(双向队列)基本用法

    deque(双向队列)基本用法 阅读体验:https://zybuluo.com/Junlier/note/1297030 简单介绍 就是可以两头插元素,两头删元素的数据结构 那么具体的STL操作(只 ...

  9. ZOJ 2706 Thermal Death of the Universe

    Thermal Death of the Universe Time Limit: 10 Seconds                                     Memory Limi ...

  10. Android手机、电视(盒子) 打开ADB调试 一览表

    手机.电视(盒子) 打开ADB调试 一览表 一.手机打开ADB调试方法 序号 名称 描述 方式 1 华为手机 EMUI 1.设置 ->关于手机-> 版本号 点击(4~5次)2.返回设置 - ...