VUE笔记——Vue指令

收集表单数据:

若:<input type="text"/>,则v-model收集的是value值,用户输入的就是value值。

若:<input type="radio"/>,则v-model收集的是value值,且要给标签配置value值

若:<input type="checkbox"/>:

        1、没有配置input的value属性,那么收集的就是checked(勾选 or 未勾选,即true or false)

        2、配置input的value属性:

        (1)v-model的初始值是非数组,那么收集的就是checked(true or false)

        (2)v-model的初始值是数组,那么收集的就是value组成的数组

        备注:v-model的三个修饰符:

                lazy:失去焦点再收集数据

                number:输入的字符串转为有效数字

                trim:输入首尾空格过滤

学过的指令:v系列

v-bind:给指令绑定动态数据,单向绑定解析表达式,可简写为 :xxx,可用来绑定style、class样式。

<标签 v-bind:class="{class样式1:数据对象属性1,class样式2:数据对象属性2,...}">

new Vue({
    el:,
    data:{
    数据对象属性1:true|false
    数据对象属性2:true|false
    ...
}
})

<标签 v-bind:style="{class样式1:数据对象属性1|样式属性值...}">

v-model:双向数据绑定,同步用户输入的数据到Vue实例的data属性

双向绑定修饰符:
1、.lazy
    默认情况下,v-model在每次input事件触发后将输入框的值与数据进行同步,
    添加.lazy修饰符后,v-model.lazy只有在回车或者在输入框失去焦点时,数据才进行同步
2、.number
    v-model.number只能输入数字,并把输入值转化为数值型
3、.trim
    v-model.trim可以将用户输入的首尾空白格过滤

v-for:遍历数组、对象、字符串

<标签 v-for="item in items"> //items是源数据数组

<标签 v-for="(item,index) in items"> //index当前数据项的索引

<标签 v-for="(item,name,index) in items"> //index当前数据项的索引


<body>
    <div id="root">
        <ul>
            <li v-for="fruit in fruits">{{fruit}}</li>
        </ul>
    </div>
    <script>
        new Vue({
            el:"#root",
            data:{
                fruits:["apple","pear","banana","lemon"]
            }
        })
    </script>
</body>

v-on:绑定事件监听,可简写为@

//无参:
//    <标签 v-on:事件名='函数名称'>
//有参:
//    <标签 v-on:事件名='函数名称(参数)'>
//在methods里申明事件调用的函数

<body>
    <div id="root">
        <button v-on:click="add">+1</button>
        <p>按钮单击了{{counter}}次</p>
    </div>
    <script>
        new Vue({
            el:"#root",
            data:{
               counter:0
            },
            methods: {
                add(){
                    this.counter++;
                }
            },
        })
    </script>
</body>

v-if:条件渲染(动态控制节点是否存在),

v-else:条件渲染((动态控制节点是否存在))

v-show:条件渲染(动态控制节点是否展示)

v-if="表达式"    //为true时被渲染显示,为false时元素删除转为注释

v-show="表达式"   //通过true|false显示/隐藏元素

//v-if为false时,DOM树中不存在该节点;而v-show只是通过css样式的display:none隐藏该元素,
//DOM树上存在该节点。

v-text:向其所在的节点中渲染文本内容。

        与插值法的区别:1)v-text会替换掉节点中的内容,{{xx}}不会;2)在网络延迟比较重的时候,{{}}插值法会先将插值表达式以文本的方式渲染出来,等到JavaScript脚本加载后,重新显现出所绑定的文本内容;而v-text方式在JavaScript脚本未加载出的情况再什么都不会显现。

v-html:1)作用:向指定节点中渲染包含html结构的内容。2)与插值语法的区别:v-html会替换掉节点中的所有的内容。{{xx}}则不会。v-html可以识别html结构。3)v-html有安全性问题。在网站上动态渲染任意HTML是非常危险的,容易导致xss攻击。一定要在可信的内容上使用v-html,不要用在用户提交的内容上。

<div id = "root">
    <p>hello {{text}}</p>                //hello world   1
    <p v-text="text">hello</p>            //world        2
    <p v-html="text">hello</p>            //world        3
</div>

new Vue({
    el:"#root",
    data:{
        text:'world';
    }
})


//2与3 重写整个文本节点的内容,渲染出的只有 world;1只影响插值所在位置的文本,而不是重写整个文本节
//点的内容,渲染出 hello world

v-cloak:没有值,本质是一个特殊属性,Vue实例创建完毕并接管容器后,会删掉v-cloak属性。使用css的{display:none}配合v-cloak就可以解决网速慢时页面展示出{{xxx}}的问题。

v-once:该指令所在节点在初次动态渲染后,就视为静态内容了;以后数据的改变不会引起v-once所在结构的更新,可以用于优化性能。

stop修饰符阻止事件冒泡:

事件冒泡:时间开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播。

vm的生命周期:

调用beforeCreate函数,将要创建,此时无法访问methods、data、computed等方法和数据,el和data还没初始化===>调用created函数,创建完毕,data和methods都可以使用了,但el还不可用,数据与页面还没有绑定===>调用beforeMount函数,将要挂载,el、data、methods可用,数据与页面还未绑定===>调用mounted函数,挂载完毕,数据与页面绑定===>调用beforeUpdate函数,将要更新,data数据最新,但页面仍是旧值===>调用updated函数,更新完毕,页面已为最新值===>调用beforeDestroy函数,将要销毁===>调用destroy函数,销毁完毕

常用的生命周期钩子:

1、mounted:发送ajax请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作 】

2、beforeDestroy:清除定时器、解绑自定义事件、取消订阅消息【收尾工作】

关于销毁Vue实例:

1、销毁后借助Vue开发者工具看不到任何信息。

2、销毁后的自定义事件会失效,但原生DOM事件依然有效。

3、一般不会在beforeDestroy操作数据,因为即使操作数据,也不会再触发更新流程了。

Vue中使用组件的三大步骤:

一、定义组件(创建组件)

        使用Vue.extend(options)创建,其中options和new Vue(options)时传入的options的主要区别如下:

        1)el不写:最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器

        2)data必须写成函数,避免组件被复用时,数据存在引用关系

        备注:使用template可以配置组件结构

二、注册组件

        1)局部注册:靠new Vue的时候传入components选项

        2)全局注册:靠Vue.component('组件名',组件)

三、使用组件(写组件标签)

        类似 <school> </school>

关于VueComponent:

1、school组件本质是一个名为VueComponent的构造函数,且不失程序员定义的,是Vue.extend生成的。

2、我们只需要写<school/> or <school><school/>,Vue解析时会帮我们创建school组件的实例对象,即Vue帮我们执行:new VueComponent(option)

3、特别注意:每次调用Vue.extend,返回的都是一个全新的VueComponent

4、关于this指向:

        1)组件配置中:

                data函数、method中的函数、watch中的函数、computed中的函数 它们的this均是【VueComponent实例对象】

        2)new Vue(options)配置中:

                data函数、methods中的函数、watch中的函数、computed中的函数,他们的this均是【Vue实例对象】

一个重要的内置关系:VueComponent.prototype.__proto__ === Vue.prototype,让组件实例对象(vc)可以访问到Vue原型上的属性、方法。

组件是 Vue.js 中最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 中,组件可以分为全局组件和局部组件,其中全局组件可在任何地方使用,而局部组件只能在其父组件中使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 中使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码中,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 中使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码中,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素中。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要在组件的配置对象中定义 props 属性,并在 HTML 中使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码中,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML 中,我们使用 v-bind 指令将 groceryList 数组中的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码中,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组中的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽是 Vue.js 中另一个重要的概念。插槽可以让父组件在子组件中插入任意的 HTML 内容,使得组件更加灵活、可复用。 在子组件中,使用 <slot> 标签来定义插槽。在父组件中,使用子组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码中,我们定义了一个名为 alert-box 的组件,并在组件中定义了一个插槽。在 HTML 中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码中,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件的插槽中。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值