vue2学习知识及问题总结一

前言:

        学习vue对vue用法有了一点浅显的理解,以下是我整理的学习笔记和理解,可能有某些地方不准确,希望各位大佬多多指点。交流交流经验。

简介:

        学习任何一门语言,我感觉语法都是次要的,最重要要了解其原理及框架设计思想,对于 vue 从最简单的模型理解,Vue实例挂在一个容器,容器负责渲染页面,至于数据交互、dom操作是由Vue具体封装指令去做。学好vue我认为一定要弄清楚的几点: 1.检测数据变化原理(vue中数据变化为什么能立刻渲染到页面上) 2.为什么引进组件、store和router?  3.vue的生命周期

一、vue的语法

1.插值表达式

   {{xx}} 用于解析标签体内容 。 插值表达式中可写哪些?      

三目运算符:

<div>{{flag ?"flag为true时展示":"flag为false时展示"}}</div>

函数表达式:

<div>{{ func() }}</div>

正则表达式:

<p>{{value.replace(/,/g,'')}}</p>   //把全部的逗号去掉

2.指令语法

   这里就不过多说明常见的指令展示下我在项目中的用法吧,重点说下自定义指令(dir)感觉非常好用

<div class="tabs_ziduan" :style="{ height: moreFlag ? 'auto' : 84 + 'px' }">
      <li v-for="editableTab in fieldSearchData === '' ? editableTabs : filteredTabs"
        :key="editableTab.fieldName"
        :title="editableTab.fieldName"
        :class="{selectedStyle:item.dynamicTags.selected && item.dynamicTags.fieldName ===         
        editableTab.fieldName}"
        @click="ClickTabsEvent(editableTab)">
            {{ editableTab.fieldName }}
       </li>
</div>
<div class="tabs_right_more" @click="clickMore">
      <div>
          <span v-text="moreFlag ? '收起' : '更多'"></span>
          <i :class="moreFlag ? 'el-icon-arrow-up' : 'el-icon-arrow-down'"></i>
      </div>
</div>

参考vue官网vue-element-admin内容

这里我展示个指令可以让点击的按钮有 波纹的动画效果

1.注册

       

2.使用

        

二、数据绑定

  1. v-bing :用于动态绑定DOM元素的属性;例如 标签的href属性,标签的src属性等。v-bind可以简写成“:”
  2. v-module:一般用于input框的双向数据绑定 ----注意: 还可用于组件之间双向数据绑定

v-module的本质:

<input v-model="test"/>

相当于:

<input :value="test" @input="test = $event.target.value"/>

相当于一个绑定一个value和一个input事件(默认是input事件)

这里的input事件就是把值 赋给test这个变量

这里总结了下组件中使用v-module的步骤和注意点:


1.子组件中 props的使用 子组件中要声明接收的数据类型

props: {
    // 接收string和number类型的值,
    myValue: [String, Number],
  },

注意:flag这个名是自定义的和父组件绑定的名字一致---但[String, Number]不能写成字符串["String","Number"],因为此时它们是构造器,是js的全局api


2.子组件 $emit的使用:  向上派发事件,在自定义组件中触发.

methods: {
    changeInput ($event) {
      this.$emit('myInput', $event.target.value)
   },
}

向上发送 myinput事件  =>  model 监听myInput事件    注意:这里的myInput必须和 model中的事件一致


3. 关键的model---model 才是组件能够使用v-model的关键所在。我们有时会省略它(有默认值),

默认情况: v-model  会把 value 用作prop 把input 用作 event ,  单选框和复选框可能使用 value prop 来达到不同的目的。使用model选项的话可以回避这些情况可能产生的冲突。 ----总结最好使用model

 // 当我们使用model的默认值的时候value作prop,input作event时,可以省略不写model。
  model: {
    prop: 'myValue', // 默认是value
    event: 'myInput', // 默认是input
  },

4.父组件的自定义组件中使用

<custom-model v-model="myValue"></custom-model>
//同效果
<custom-model :my-value="myValue"></custom-model>

这里参考了:如何在vue自定义组件中使用 v-model指令 - 掘金

三、el与data

1、el挂载

  • 直接绑定   el:"#root"
  • vue实例下$mout("#root")方法:   vm.$mount("#root")

vue3好像用的  createApp方法创建实例,使用其下mount方法来挂载组件

2、data数据

分为两种方法对象式 和 函数式。这里讲下为啥组件中data必须是函数式?

 避免组件间数据相互影响,如果data是个对象所有组件共享一个对象,很大可能互相污染。

我的理解是: data作为函数的返回值 每个实例调用相当于 深拷贝了很多份,相互间不影响

data如果是对象的话  相当于复杂数据类型  只拷贝 指针  

就像: let obj={name:"张三"}  objTemp =obj;     objTemp.name="3434"  =》log(obj)

             结果let obj={name:"3434"}   一样的道理  终究是浅拷贝

     2.1检测数据改变原理:

        首先明确vue是通过Object.defineProperty()检测数据变化的

Object.defineProperty(person, 'age', {
  //当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
   get() {return number},
   //需求:当有人修改person的age属性时,set函数(setter)就会被调用,且会受到修改的具体值
   set(value) {number = value}
})

data中数据每一个有相应的 set 和get 并且会拷贝(浅拷贝)一份到 组件实例下一份,所以data中数据变化 页面才能够知道 并且更新视图

  2.2、更改数组或数组对象数据

1.当使用vm.data.person[0].name="" 形式更改数组。

         

        

person中 name与age 有数据代理,所以直接对数组对象内属性name更改可以实现且界面更改

2.而使用vm.data.person[0]= {id:"003",name:"王五",sex:"未知"}

不能进行更改  因为 0,1没有相应的set get

    

注意:对于后添加到data中的数据 因为 没有 通过  Object.defineProperty()检测所以并没有相应的set 和get 所以不是响应式数据

vue数据检测总结:

    1.vue会检测data中所有层次的数据

    2.如何检测对象中的数据?

        1)对象中后追加的属性,vue默认不做响应式处理

        2)如需给后添加的属性做响应式,调用api

            Vue.set(target,propertyName/index,value)

            vm.$set(target,propertyName/index,value)

    3.如何检测数组中的数据?

        通过包裹数组更新元素的方法实现,本质是做两件事:

        1)调用原生对应方法对数组进行更新

        2)更新解析模板,进而更新页面。

    4.再Vue修改数组中某一个元素一定要调用以下方法:

        1、这些API:push()/pop()/shift()/unshift()/splice()/sort()/reverse()

        2、Vue.set()或vm.$set()

        注意的:Vue.set()和vm.$set()不能给vm或vm的根数据对象添加属性

四、事件处理

没啥好说的最常用的@click="func(number,$event)"      注意参数和函数内部this指向就行

其他的鼠标键盘事件类似,还有几个事件修饰符,    有js基础看看就会用

vue事件修饰符:

        1.prevent:阻止默认事件

        2.stop 组织事件冒泡

        3.once:事件只触发一次

        4.capture:事件捕获

注意:

所有被vue管理的函数,最好携程普通函数,这样 this指向 当前实例组件

所有不被vue管理的函数 最好写成箭头函数  这样this指向的才是 当前实例组件
methods 、computed、watch都是vue所管理的

五、计算属性computed

特点:根据已有属性,创建新属性

 1. 初次读取调用一次,所依赖的数据(计算属性fullname   ,所依赖的firstname ,lastname)变化时调用一次 ,且有缓存

 2. 不要把计算属性当作函数,尤其是简写形式  写法虽然像函数,但是 它本质是属性, 属性名放到vm实例下    get()函数返回值作为计算属性的值

简写形式:大多用简写形式

对象形式:

六、监听watch

特点:对已有属性进行监听

简写形式:大多用简写

对象形式:

总结:

♦ 数组(一维、多维)的变化不需要通过深度监听,

♦ 对象数组中对象的属性变化则需要deep深度监听

*********************************************************************************************************************************************************************

自己学习的浅显的经验,仅供交流,希望早日成为大佬!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值