Vue基础(二)——模板语法

2023-11-19

一、指令

1、v-bind:绑定属性【:】

2、v-on:绑定事件【@】

3、v-if和v-show

(1)介绍

<template>
    <div>
        <h1 v-if="false"> hello world</h1>
        <h2 v-show="false"> hello world</h2>
    </div>
</template>

值为false时,页面上不显示数据。 

打开控制台:

v-if不渲染DOM。如果值为false的话。

v-show渲染DOM,将元素设置为【display:none】 

 (2)案例

<template>
    <div>
        <p v-if="isLogin">欢迎:</p>
        <p v-if="!isLogin"><a href="">请登录...</a></p>
    </div>
</template>

<script>
export default {
    data() {
        return {
            isLogin: true,
        };
    },
};
</script>

isLogintrue时:

isLoginfalse时:

4、v-for

(1)案例(一)——水果列表

<template>
    <div>
        <ul>
            <li v-for="(fruit,index) of fruits" :key="index">
                <p>水果序号:{{index}}</p>
                <p>水果名称:{{fruit}}</p>
            </li>
        </ul>
    </div>
</template>

<script>
export default {
    data() {
        return {
            fruits: ["苹果", "香蕉", "鸭梨"],
        };
    },
};
</script>

 

(2)案例(二)——学生表格

<template>
    <div>
        <table border="1">
            <thead>
                <th>序号</th>
                <th>姓名</th>
                <th>年龄</th>
            </thead>
            <tbody>
                <tr v-for="(student,index) of students" :key="index">
                    <td>{{index+1}}</td>
                    <td>{{student.name}}</td>
                    <td>{{student.age}}</td>
                </tr>
            </tbody>
        </table>
    </div>
</template>

<script>
export default {
    data() {
        return {
            students: [
                { name: "小明", age: 18 },
                { name: "小红", age: 19 },
                { name: "小亮", age: 20 },
            ],
        };
    },
};
</script>

 

二、组件嵌套

1、组件命名:大写字母开头,驼峰命名

自定义组件一般放在components文件夹里面。 

components文件夹,新建MyHello.vue文件。 

2、注册组件

(1)MyHello.vue文件:

<template>
    <h1>hello component</h1>
</template>

(2)App.vue文件:

<template>
    <div>
        <MyHello></MyHello>
        <My-hello></My-hello>
    </div>
</template>

<script>
// 引入组件
import MyHello from "./components/MyHello.vue";
export default {
    // 注册组件
    components: {
        MyHello: MyHello,
    },
};
</script>

中间可以加上横线。 

也可以简写:

components: {
        MyHello
    },

(3)页面效果:

 

3、组件传值

App.vue:父级

MyBrother.vue,MyChild.vue:子级

(1)父级向子级传递数据——使用标签的属性传递

App.vue:(父级)

<template>
    <div>
        <h1>hello world</h1>
        <MyChild :msg="message"></MyChild>
    </div>
</template>

<script>
import MyChild from "./components/MyChild.vue";
export default {
    components: {
        MyChild: MyChild,
    },
    data() {
        return {
            message: "app.vue data",
        };
    },
};
</script>

msg自定义的属性。 

MyChild.vue:(子级)

<template>
    <h1>{{msg}}</h1>
</template>

<script>
export default {
    props: ["msg"],
};
</script>

props:属性的属性。 

页面显示:

父级的数据:【message】,传递给了子级:【MyChild】。

通过标签属性传递。

关键代码: 

<MyChild :msg="message"></MyChild>

(2)子级向父级传递数据——用自定义事件

App.vue:(父级)

<template>
    <div>
        <h1>{{h1Data}}</h1>
        <my-child @myevent="changeData"></my-child>
    </div>
</template>

<script>
import MyChild from "./components/MyChild.vue";
export default {
    components: { MyChild },
    data() {
        return {
            h1Data: "before",
        };
    },
    methods: {
        changeData(data) {
            this.h1Data = data;
        },
    },
};
</script>

@myevent = “”:自定义事件。

changeData(data):参数data是从子级那边传过来的。并且,将h1标签的h1Data值更改。

 MyChild.vue:(子级)

<template>
    <div>
        <button @click="sendData">传递数据</button>
    </div>
</template>

<script>
export default {
    data(){
        return {
            childData:"i am childData"
        }
    },
    methods: {
        sendData() {
            // $emit可以触发父级的自定义事件,把childData传给myevent
            this.$emit("myevent",this.childData)
        },
    },
};
</script>

// $emit可以触发父级的自定义事件,把childData传给myevent

            this.$emit("myevent",this.childData)

点击按钮时,触发sendData方法。 

效果:

原先数据为:before,点击按钮后,子级向父级传递了数据:i am childData。

  

(3)案例——购物车(一)

项目目录:

App.vue:

<template>
    <div>
        <my-cart></my-cart>
    </div>
</template>

<script>
import MyCart from "./components/MyCart.vue";
export default {
    components: { MyCart },
};
</script>

 App.vue引入MyCart.vue组件。

MyCart.vue:

<template>
    <span>
        <h1>购物车</h1>
        <ul>
            <li v-for="(fruit,index) of fruits" :key="index">
                {{fruit.name}},单价:{{fruit.price}},数量:
                <my-count :count="fruit.count" :index="index" @add="add" @sub="sub">
                </my-count>
            </li>
        </ul>
    </span>
</template>

<script>
import MyCount from "./MyCount.vue";
export default {
    components: {
        MyCount,
    },
    data() {
        return {
            fruits: [
                { name: "苹果", price: "5", count: "0" },
                { name: "香蕉", price: "3", count: "0" },
                { name: "鸭梨", price: "4", count: "0" },
            ],
        };
    },
    methods: {
        sub(index) {
            if (this.fruits[index].count > 0) {
                this.fruits[index].count--;
            }
        },
        add(index) {
            this.fruits[index].count++;
        },
    },
};
</script>

MyCart.vue里面有一个水果列表,按钮是引入MyCount.vue组件 

MyCount.vue:

<template>
    <span>
        <button @click="sub">-</button>
        <span>{{count}}</span>
        <button @click="add">+</button>
    </span>
</template>

<script>
export default {
    props: ["count", "index"],
    methods: {
        sub() {
            this.$emit("sub", this.index);
        },
        add() {
            this.$emit("add", this.index);
        },
    },
};
</script>

这个案例是,父级向子级子级向父级,传递数据,的一个应用。 

(4)非父子级传递数据

项目目录:

MyBrother.vue和MySister.vue为同级。

MyBrother.vue:

<template>
    <div>
        <h1>Brother</h1>
        <button @click="changeData">改变数据</button>
        <p>{{state.message}}</p>
    </div>
</template>

<script>
import Store from "../store";
export default {
    data() {
        return {
            state: Store.state,
        };
    },
    methods: {
        changeData() {
            Store.setStateMessage("new data");
        },
    },
};
</script>

MySister.vue:

<template>
    <div>
        <h1>Sister</h1>
        <p>{{state.message}}</p>
    </div>
</template>

<script>
import Store from "../store";
export default {
    data() {
        return {
            state: Store.state,
        };
    },
};
</script>

新建store.js文件,存放共同数据。

export default {
    // 状态(规范写法),存放共同数据
    state: {
        message: "hello vue"
    },
    setStateMessage(str) {
        this.state.message = str
    }
}

App.vue:

<template>
    <div>
        <my-brother></my-brother>
        <my-sister></my-sister>
    </div>
</template>

<script>
import MyBrother from "./components/MyBrother.vue";
import MySister from "./components/MySister.vue";
export default {
    components: { MyBrother, MySister },
};
</script>

效果:

点击按钮时,调用store.js的方法,更改共同数据

从而实现,非父子级间的传递数据。 

(5)购物车重置按钮

修改MyCart.vue即可。

<template>
    <div>
        <h1>购物车</h1>
        <button @click="clear">重置数量</button>
        <ul>
            <li v-for="(fruit,index) of fruits" :key="index">
                {{fruit.name}},单价:{{fruit.price}},数量:
                <my-count :count=fruit.count @sub="sub" @add="add" :index="index"></my-count>
            </li>
        </ul>
    </div>
</template>

<script>
import MyCount from "./MyCount.vue";
export default {
    components: {
        MyCount,
    },
    data() {
        return {
            fruits: [
                { name: "苹果", price: "3", count: "0" },
                { name: "香蕉", price: "4", count: "0" },
                { name: "鸭梨", price: "5", count: "0" },
            ],
        };
    },
    methods: {
        sub(index) {
            if (this.fruits[index].count > 0) {
                this.fruits[index].count--;
            }
        },
        add(index) {
            this.fruits[index].count++;
        },
        clear() {
            for (let i in this.fruits) {
                this.fruits[i].count = 0;
            }
        },
    },
};
</script>

效果:

三、总结

 将系统拆分成组件,一方面降低了功能的耦合,但是另一方面也提升了数据的传输难度

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue基础(二)——模板语法 的相关文章

随机推荐

  • 动态渲染 echarts 饼图(vue 2 + axios + Springboot)

    目录 前言 1 项目搭建 1 1 前端 1 2 后端 2 后端数据渲染前端 2 1 补充1 在 vue 中使用 axios 2 2 补充2 Springboot 处理跨域问题 2 3 修改前端代码 2 3 1 修改饼图样式 2 3 2 调用
  • Fast-ReID 训练自己的数据集调优记录(一)

    Fast ReID前期准备 文章目录 Fast ReID前期准备 前言 一 Fast ReID 介绍 Fast ReID 特点 FastReID 架构 二 Fast ReID 复现 前言 FastReID 是一个 SOTA 级的 ReID
  • Linux开放普通用户使用winscp上传文件和禁止root用户登录

    鉴于使用root用户操作系统有诸多风险 也给网络黑客暴力破解服务器密码可乘之机 于是决定禁用root用户远程登录系统 可是禁用root用户登录系统也带来一个问题 那就是root用户登录不了WinScp 也就没办法上传文件了 这还了得 这会给
  • qt中加载qss样式不生效的问题

    前提是你能正确加载 而且 你试着将你的qss后缀改成css 发现能生效 但是后缀改成qss没有生效 这个原因就是字符编码的问题了 需要改成utf 8才行 使用notepade 来改是一种方式 参考博客 QT 避坑指南 QSS文件引入及解决自
  • Allegro使用总结-查看Layout基本操作:

    好久没用CSDN写过笔记了 没想到无意间打开 编辑器更新啦 以前巨难用的 富文本编辑器 终于改观了 变的好像语雀 1 视图 画面操作 a 画面缩放 Zoom F11 F12 或 鼠标滚轮 补充 Zoom分辨率调节 Setup user pr
  • Unity2019_寻路系统

    简单导航寻路功能 选定为静态网格导航 Windows gt Ai gt Navigation 点击烘焙 角色上挂一个导航网格组件 挂上脚本 鼠标点击位置设置为导航的终点 using UnityEngine using UnityEngine
  • admin-lte+ng-bootstrap组合开发之modal弹层不显示

    在用admin lte做前端页面框架做开发 需要用到弹出层效果时 看到ng bootstrap中有Modal实现弹层效果 步骤如下 1 安装和配置ng bootstrap 具体见 https www jianshu com p 690080
  • Qt

    Qt UDP广播通信的使用 实战项目使用案例 1 UDP广播介绍 UDP广播地址固定IP地址为 XXX XXX XXX 255 如果向全网段发送广播消息 那么广播地址为 255 255 255 255 如果向单个网段发送广播消息 例如你的I
  • Java中方法的重载和重写

    重载是在同一个类中的具有相同方法名 不同参数 个数 类型 顺序 的方法的定义 构造方法 普通方法 抽象方法都可以重载 重写是在子类继承父类的时候重写 在子类重写的方法名必须和父类的方法名完全相同 可以用 Override检查是否是重写方法
  • 白盒测试和静态测试

    白盒测试技术是根据被测对象的结构 系统化设计测试用例的一种方法 又称透明盒测试 或结构测试 测试覆盖准则之白盒测试设计技术的核心代码覆盖标准 1 语句覆盖 2 判定覆盖 3 条件覆盖 4 判定条件覆盖 5 条件组合覆盖 6 路径覆盖 白盒测
  • LeetCode刷题之旅【多线程篇-4】中等: 1116. 打印零与奇偶数

    2019年11月22日 目录 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障 解题2 synchronized独占锁 线程阻塞与唤醒 拓展 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障
  • NVIDIA视频硬解码

    硬解码流程 创建cuda上下文 查询硬件解码器解码能力 创建解码器实例 使用第三方软件 如FFMPEG 进行Demux 使用第三方解析器 如FFMPEG 解析视频比特流 使用NVDECODE API启动解码 获取解码后的YUV进行进一步处理
  • 刷脸支付服务商帮助微信支付宝拓展市场服务客户

    如今的刷脸支付市场 随着微信刷脸支付 青蛙 的内测完成 马上就会和支付宝的 蜻蜓 有一场争夺市场的大战了 两大巨头打架 肯定会有很多的政策 到时候刷脸支付下面的人就能分一点汤 一定要记住 申请服务商是免费公开透明的 想要好好了解的就去支付宝
  • 大小端与结构体释疑

    本人在做项目过程中需要在ARM对从FPGA读取到的数据进行处理 在实际过程中产生了一些问题 在思考了后记录在此 1 大小端模式 大小端指数据在内存中的存储方式 小端指数据的高字节保存在内存的高地址处 低字节保存在内存的低地址处 大端模式则正
  • 【os模块】os.walk 获取指定路径下文件名

    os walk函数原型 os walk是python中的一个函数 函数声明 os walk top topdown True nerr r None top 目标路径 topdown 默认值是 True 表示首先返回顶级目录下的文件 然后再
  • c++ Sigmoid/Softmax/Argmax

    Sigmoid float sigmoid float x return 1 1 exp x float sigmoid dy dz float x return x 1 0 x float tanh dy dz float x retur
  • ES按日期滚动索引

    按日期滚动索引 环境 ES 6 9 ES 7 Centos 7 配置过程 创建索引 PUT localhost 9200 index 20210915 设置索引别名 写入别名和读取别名 PUT localhost 9200 index 20
  • 网络 -- n/24 计算IP范围

    1 IP地址 共分为四类 A B C D类 A类 从1 0 0 0 到 126 255 255 255 B类 从128 0 0 0 到 191 255 255 255 C类 从192 0 0 0 到 223 255 255 255 其中12
  • 关于输入、输出电容在 LDO 应用中的重要性

    关于输入 输出电容在 LDO 应用中的重要性 如何让LDO 产品在应用中达到更佳的稳定性 则用户在设计电路时 最好根据芯片 datasheet 的说明文档而定 下面以LP2985 3 3这个LDO为例 LP2985 3 3是低功耗 低压差
  • Vue基础(二)——模板语法

    一 指令 1 v bind 绑定属性 2 v on 绑定事件 3 v if和v show 1 介绍