Vue基础 ---指令系统

本文介绍了Vue的指令系统,包括数据绑定、属性绑定、条件渲染、列表渲染、事件处理和表单修饰符。重点讲解了v-model、v-bind、v-if/v-show、v-for等核心指令的用法及优缺点,帮助理解MVVM模式在Vue中的应用。
摘要由CSDN通过智能技术生成

Vue指令系统

vue 指令是什么?

指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

vue常用指令:

1.数据绑定

非表单元素_单向数据绑定_:div span ul li h1-h6 p等

{{}} v-html v-text
模板语法:

Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML,所以能被遵循规范的浏览器和 HTML 解析器解析。
如果你熟悉虚拟 DOM 并且偏爱 JavaScript 的原始力量,你也可以不用模板,直接写渲染 (render) 函数,使用可选的 JSX 语法。

{{}} 模板语法 优点:简单 方便 缺点:不能解析标签,首屏会出现闪屏问题
v-html 优点:可以解析标签 缺点:不方便
v-text 优点:可以解决首屏闪屏问题 缺点:不方便,不能解析标签

<div id="app">
        <h1>模板语法</h1>
        <div>{{msg}}</div>
        <!-- {{}}内部js解析,{{}}外面 html解析 -->
        <div>hello, {{name}}</div>
        <!-- {{}} 内部必须遵循js的语法 -->
        <div>{{'hello,'+name}}</div>
        <!-- {{}} 三元 -->
        <div>{{n>10?name:'王昭君'}}</div>
        <!-- {{}} 方法 -->
        <div>价格:{{price.toFixed(2)}}</div>
        <div>{{strHTML}}</div>
    </div>
    <script>
        new Vue({
            el:"#app",
            data:{
                msg:"画画的baby,画画的baby",
                name:"妲己",
                n:10,
                price:19.90,
                strHTML:"<em>哈哈哈哈</em>"
            },
            methods:{}
        })
    </script>
表单元素_双向数据绑定_:Input、textarea、select-option …

v-model:双向数据绑定

<div id="app">
        <!-- 视图 -->
        <h2>{{name}}</h2>
        <input type="text" v-model="name">
        <button v-on:click="login()">提交</button>
    </div>
    <script>
        // 4.实例化vue对象
        new Vue({
            //element
            el:"#app",
            data:{//数据 模型
                //双向数据绑定
                //MVVM模式: M-model模型 V-view视图  VM-viewModel视图模型
                //模型通过 视图模型 控制视图,视图又可以 通过视图模型 修改模型,视图模型是模型和视图之间的桥梁
                //MVVM模式
                name:"张三"
            },
            methods:{
                login(){
                    console.log(this.name);
                }
            }
        })
    </script>

2.属性绑定

媒体元素:img video

v-bind 简写
v-bind 指令将该元素的 href attribute 与表达式 url 的值绑定。

<div id="app">
        <!-- 属性绑定 v-bind,可以绑定已经存在的属性,也可以绑定自定义属性  -->
        <!-- v-bind 后面的内容必须满足js的语法 -->
        <a v-bind:href="compony.url"  v-bind:title="compony.name">
            <img v-bind:src="compony.logo" alt="易烊千玺">
        </a>
        <!-- 属性可以自己定义 -->
        <div v-bind:sum="x+y+'aa'">这是自己定义的</div>

        <!-- 简写 : -->
        <a :href="compony.url" :title="compony.name">
            <img :src="compony.logo" alt="">
        </a>
        <div :sum="x+y+'aa'">这是自己定义的</div>
    </div>
			<script>
        // 3.实例化
        new Vue({
            el:"#app",//挂载点
            data:{//属性
                compony:{
                    name:"易烊千玺",
                    url:"https://baike.baidu.com/item/%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA/221450?fr=aladdin",
                    logo:"https://bkimg.cdn.bcebos.com/pic/9825bc315c6034a881b02393c413495409237656?x-bce-process=image/resize,m_lfit,h_500,limit_1"
                },
                x:10,
                y:20
            },
            methods:{//方法

            }
        })
    </script>
动态属性
动态class=>:class
	<!-- 第一种方式: :class="变量" -->
    <h3 :class="class1">天道酬勤</h3>
    <!-- 第二种方式 : :class="[三元]" 就只有两种情况 -->
    <h3 :class="[aa?'red blue':'yellow purple']">人道酬善</h3>
    <!-- 第三种方式 :class="{'类名1':boolean,'类名2':boolean}" -->
    <h3 :class="{'red':isRed,'yellow':isYellow,'lime':isLime,'purple':isPurple,'blue':isBlue}">商道酬信</h3>
    
	<div v-bind:class="{ active: isActive }"></div>
	<script>
		new Vue({
	        el:"#app",//挂载点
	        data: {
				isActive: true,
				hasError: false
			}
	    })
	</script>
	
动态style:=>:style

v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 或短横线分隔来命名

	<!-- 动态style  :style="json" -->
	<div v-bind:style="styleObject"></div>
	<!-- 动态style  :style="[数组语法]" -->
	<div v-bind:style="[baseStyles, overridingStyles]"></div>
	<button v-on:click="changeColor()">点击字体颜色改为orange</button>
	
	<script>
 		new Vue({
            el:"#app",//挂载点
            data: {
			  styleObject: {
			    color: 'red',
			    fontSize: '13px'
			  }
			},
			methods:{//方法
                changeColor(){
                    this.json.color="orange"
                }
            }
        })
       </script>

3.条件渲染

v-if v-show v-else

相同点:
v-if 和v-show 都是true显示,false 消失
不相同点:
v-if false 不加载节点-惰性加载
v-show false 加了display:none
使用场景:
频繁切换,建议使用v-show,不频繁切换,建议使用v-if.
补充:v-else
v-else必须接着v-if

v-if v-else

  	<h2 v-if="isShow">优秀是一种习惯</h2>
  	<h2 v-else>认真是一种态度</h2>
 	<div id="app">
        <!-- v-if 条件渲染,true 出现,false消失。 -->
        <h3 v-if="false">画画的baby 画画的baby</h3>
        <!-- 0为假,非0即为真 -->
        <h3 v-if="-1">奔驰的小野马和带刺的玫瑰</h3>

        <h3 v-if="a">优秀是一种习惯</h3>
        <h3 v-if="b">认真是一种态度</h3>

        <button v-on:click="toggle()">切换</button>
        <h3 v-if="isshow">坚持是一种品格</h3>
        
        <h3 v-if="comment.length==0">暂无数据</h3>
        <h3 v-if="comment.length>0">有数据</h3>
        <hr>
        <h3 v-if="comment.length==0">暂无数据</h3>
        <h3 v-else>有数据</h3>
    </div>
    <script>
        new Vue({
            el: "#app",
            data: {
                a: true,
                b: '123',
                isshow: true,
                comment:["物美价廉",'特别好',"推荐"]
            },
            methods: {
                toggle() {
                    /*
                    if (this.isshow) {
                        this.isshow = false
                    } else {
                        this.isshow = true;
                    }*/ 
                    this.isshow=!this.isshow;
                }
            }
        })
    </script>

v-show

	<div id="app">
       <!-- v-show true 出现,false 消失 -->
        <h3 v-show="false">画画的baby 画画的baby</h3>
       
        <button v-on:click="toggle()">切换</button>
        <h3 v-show="isshow">坚持是一种品格</h3>

    </div>
    <script>
        new Vue({
            //element
            el: "#app",
            data: {
                isshow: true
            },
            methods: {
                toggle() {
                    this.isshow=!this.isshow;
                }
            }
        })
    </script>

4.列表渲染

v-for

v-for 指令基于一个数组来渲染一个列表。 v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。

	<div id="app">
        <ul>
            <li v-for="(item,index) in comment">{{index+1}}-{{item}}</li>
        </ul>
        <div>
            <a :href="item.url" :title="item.name" v-for="(item,index) in website">
                <img :src="item.logo" alt="">
            </a>
        </div>
        <div class="box">
            <div class="item" v-for="x in goods">
                <img :src="x.img" alt="">
                <h3>{{x.title}}</h3>
                <p>{{x.info}}</p>
                <p>{{x.num}}</p>
            </div>
        </div>
    </div>
    <script>
        var vm = new Vue({
            el: "#app",
            data: {
                comment: ["物美价廉", '特别好', "推荐", "物美价廉", '特别好', "推荐"],
                website: [{
                        name: "京东",
                        url: "http://jd.com",
                        logo: "http://img1.360buyimg.com/da/jfs/t1/17098/23/11599/160999/5c90a484E27dd5514/7287f0d182775168.gif"
                    },
                    {
                        name: "淘宝",
                        url: "http://taobao.com",
                        logo: "http://img.alicdn.com/tfs/TB1UDHOcwoQMeJjy0FoXXcShVXa-286-118.png"
                    },
                    {
                        name: "百度",
                        url: "http://baidu.com",
                        logo: "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"
                    },
                ],
                goods: [{
                        img: "https://img.alicdn.com/tfscom/i1/1581756766/TB2TF0ch0zJ8KJjSspkXXbF7VXa_!!1581756766.jpg_360x360xzq90.jpg_.webp",
                        title: "大豆家  方头奶奶鞋",
                        info: "一脚蹬设计,方便日常的穿脱。",
                        num: "378人都说好"
                    },
                    {
                        img: "https://img.alicdn.com/tfscom/i3/2459354798/TB2IyE5eUhnpuFjSZFpXXcpuXXa_!!2459354798.jpg_360x360xzq90.jpg_.webp",
                        title: "大豆家  方头奶奶鞋",
                        info: "一脚蹬设计,方便日常的穿脱。",
                        num: "358人都说好"
                    },
                    {
                        img: "https://img.alicdn.com/tfscom/i4/654230132/O1CN011CqUjXBxyNTXTMy_!!654230132.jpg_360x360xzq90.jpg_.webp",
                        title: "大豆家  方头奶奶鞋",
                        info: "一脚蹬设计,方便日常的穿脱。",
                        num: "58人都说好"
                    },

                ]
            }
        })
    </script>

vue的v-for更新的时候采用的是“就地更新”原则,如果更新的时候想要提高更新的性能,我们需要给vue一个标识,作为对比条件,这个标识必须是唯一的,所以一般使用id.

在脚手架中必须加上key,不然报错

 		<ul>
           <li v-for="(a,b) in people" :key="a.id">
               <h3>{{b}}姓名:{{a.name}}</h3>
               <p>金额:{{a.money}} <button v-on:click="add(b)">++</button> </p>
           </li>
       </ul>

5.事件处理

v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

<div id="example-3">
  <button v-on:click="say('hi')">Say hi</button>
  <button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
  el: '#example-3',
  methods: {
    say: function (message) {
      alert(message)
    }
  }
})
</script>

6.表单修饰符

  		<!-- .lazy 失去光标才修改模型数据,优化 -->
       <input type="text" v-model.lazy="name">

       <!-- .number 将绑定的数据 的数据类型转换为number -->
       <input type="text" v-model.number="age" v-on:blur="blur()">

       <!-- .trim 去空格 -->
       <input type="text" v-model.trim="name">

7.事件处理

事件修饰符,.stop .prevent .capture .self .once .passive
按键修饰符,:keyup.enter :keydown.down
按键码,.enter .tab .delete (捕获“删除”和“退格”键) .esc .space .up .down .left .right
系统修饰键,.ctrl .alt .shift .meta
鼠标按钮修饰符.left .right .middle,
新增:.exact 修饰符- 修饰符允许你控制由精确的系统修饰符组合触发的事件。

<div id="app">
        <!--1. .prevent 阻止默认事件 -->
        <div class="box" @contextmenu.prevent="yj"></div>
        <!-- 案例 -->
        <input type="text" @keydown.38.prevent="up">
        
        <!--2 .stop 阻止事件传播 -->
        <div class="outer" @click="outerClick">
            <div class="inner" @click.stop="innerClick"></div>
        </div>
        <!-- 案例 -->
        <button @click="isshow=true">删除</button>
        <div class="mask" v-if="isshow" @click="isshow=false">
            <div class="con" @click.stop="conClick()">
                <h3>你确定要删除吗?</h3>
                <button @click="isshow=false">取消</button>
                <button>确定</button>
            </div>
        </div>

        <!-- 3. .self 触发的目标元素是自身,才执行 -->
        <button @click="isshow2=true">删除2</button>
        <div class="mask" v-if="isshow2" @click.self="isshow2=false">
            <div class="con" >
                <h3>你确定要删除吗2?</h3>
                <button @click="isshow2=false">取消</button>
                <button>确定</button>
            </div>
        </div>

        <!--4 .left .right .up .down .enter .13   -->
        <input type="text" 
        @keydown.up="up2"
        @keydown.down="down"
        @keydown.enter="enter"
        @keydown.left.prevent="left"
        @keydown.right="right"
        >

        <!--5 .capture 捕获 -->
        <div class="outer" @click.capture.stop="outerClick">
            <div class="inner" @click.capture="innerClick">捕获</div>
        </div>

        <!-- 6. .native 解决组件绑定不上事件 -->
       <hello @click.native="outerClick"></hello>
       
       <!-- 新增:7.点击事件将只会触发一次 -->
		<a v-on:click.once="yj"></a>

    </div>
    <script>
        new Vue({
            el: "#app",//挂载点
            data: {//属性
                isshow:false,
                isshow2:false
            },
            methods: {//方法
                yj() {
                    console.log("右键了");
                },
                outerClick() {
                    console.log("outer click");
                },
                innerClick() {
                    console.log("inner click");
                },
                up() {
                    console.log("按了上键");
                },
                conClick(){},
                up2(){
                    console.log("上键");
                },
                down(){
                    console.log("下键");
                },
                enter(){
                    window.open("http://baidu.com")
                },
                left(){
                    console.log("left");
                },
                right(){
                    console.log("right");
                },
            }
        })
    </script>

6.MVVM模式

适用:大量的数据增删改查的操作

M-model 模型 V-view 视图 VM-viewModel 视图模型 (控制器)
模型通过控制器决定了视图,
视图可以通过控制器修改模型,
视图模型是模型和视图之前的桥梁。

总结:常用指令
表单元素:v-model
非表单元素: {{}} v-html v-text
属性绑定:v-bind=》: v-on=》@
条件渲染:v-if v-else v-show
列表渲染:v-for

Vue是一种流行的JavaScript框架,用于构建用户界面。它采用了组件化的开发方式,使得开发者可以将页面拆分成多个独立的组件,每个组件负责自己的逻辑和样式。Vue具有简洁易学的语法和高效的性能,因此在前端开发中得到了广泛应用。 Vue-grid-layout是Vue的一个插件,用于实现网格布局。它提供了一个可拖拽和可调整大小的网格系统,使得开发者可以轻松地创建灵活的布局。通过使用vue-grid-layout,开发者可以将页面元素按照网格的形式进行排列,并且可以通过拖拽和调整大小来改变元素的位置和尺寸。 以下是一个简单的示例代码,展示了如何在Vue中使用vue-grid-layout: ```html <template> <div> <vue-grid-layout :layout="layout" :col-num="12" :row-height="30" :is-draggable="true" :is-resizable="true"> <div v-for="item in layout" :key="item.i" :data-grid="item"> {{ item.i }} </div> </vue-grid-layout> </div> </template> <script> import VueGridLayout from 'vue-grid-layout'; export default { components: { VueGridLayout }, data() { return { layout: [ { x: 0, y: 0, w: 2, h: 2, i: '1' }, { x: 2, y: 0, w: 4, h: 2, i: '2' }, { x: 6, y: 0, w: 2, h: 4, i: '3' } ] }; } }; </script> ``` 在上面的代码中,我们首先导入了vue-grid-layout插件,并将其注册为Vue的组件。然后,在模板中使用`vue-grid-layout`标签来创建一个网格布局容器。通过设置不同的属性,我们可以定义网格的列数、行高、是否可拖拽和调整大小等。在`vue-grid-layout`标签内部,我们使用`v-for`指令来遍历`layout`数组,并将每个元素渲染为一个网格项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值