二七(vue2-03)、生命周期四个阶段及八个钩子、工程化开发和脚手架、组件注册、拆分组件

1. 生命周期

1.1 生命周期四个阶段

<!-- 
  Vue生命周期:一个Vue实例从 创建 到 销毁 的整个过程。
  生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁
    1.创建阶段:创建响应式数据
    2.挂载阶段:渲染模板
    3.更新阶段:修改数据,更新视图
    4.销毁阶段:销毁Vue实例
-->

1.2 生命周期钩子

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <div id="app">
      <h3>{{ title }}</h3>
      <div>
        <button @click="count--">-</button>
        <span>{{ count }}</span>
        <button @click="count++">+</button>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>

    <!-- 
      Vue生命周期钩子
      Vue生命周期过程中,会自动运行一些函数,被称为【生命周期钩子】,
      让开发者可以在【特定阶段】运行自己的代码
    -->
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          count: 100,
          title: "计数器",
        },

        beforeCreate() {
          console.log("beforeCreate", this.count);
          // beforeCreate undefined
        },
        created() {
          console.log("created", this.count);
          // created 100
        },
        beforeMount() {
          console.log("beforeMount", document.querySelector("h3"));
          // beforeMount <h3>​{{ title }}​</h3>​
        },
        mounted() {
          console.log("mounted", document.querySelector("h3"));
          // mounted <h3>​计数器​</h3>​
        },
        beforeUpdate() {
          console.log(
            "beforeUpdata",
            this.count,
            document.querySelector("span").innerHTML
          );
          // beforeUpdata 101 100
        },
        updated() {
          console.log(
            "updated",
            this.count,
            document.querySelector("span").innerHTML
          );
          // updated 101 101
        },

        // app.$destroy()
        beforeDestroy() {
          console.log("beforeDestory");
        },
        destroyed() {
          console.log("destroyed");
        },
      });
    </script>
  </body>
</html>

1.3 生命周期案例

1.3.1 created应用 - 新闻列表

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        list-style: none;
      }

      .news {
        display: flex;
        height: 120px;
        width: 600px;
        margin: 0 auto;
        padding: 20px 0;
        cursor: pointer;
      }

      .news .left {
        flex: 1;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        padding-right: 10px;
      }

      .news .left .title {
        font-size: 20px;
      }

      .news .left .info {
        color: #999999;
      }

      .news .left .info span {
        margin-right: 20px;
      }

      .news .right {
        width: 160px;
        height: 120px;
      }

      .news .right img {
        width: 100%;
        height: 100%;
        object-fit: cover;
      }
    </style>
  </head>

  <body>
    <div id="app">
      <ul>
        <li class="news" v-for="item in list" :key="item.id">
          <div class="left">
            <div class="title">{{item.title}}</div>
            <div class="info">
              <span>{{item.source}}</span>
              <span>{{item.time}}</span>
            </div>
          </div>
          <div class="right">
            <img :src="item.img" alt="" />
          </div>
        </li>
      </ul>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
      // 接口地址:http://hmajax.itheima.net/api/news
      // 请求方式:get
      const app = new Vue({
        el: "#app",
        data: {
          list: [],
        },

        // created 数据准备好了,可以开始发送初始化渲染请求。
        async created() {
          const res = await axios.get("http://hmajax.itheima.net/api/news");
          // console.log(res.data.data)
          this.list = res.data.data;
        },
      });
    </script>
  </body>
</html>

1.3.2 mounted应用 - 输入框获取焦点

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>示例-获取焦点</title>
    <!-- 初始化样式 -->
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/reset.css@2.0.2/reset.min.css"
    />
    <!-- 核心样式 -->
    <style>
      html,
      body {
        height: 100%;
      }

      .search-container {
        position: absolute;
        top: 30%;
        left: 50%;
        transform: translate(-50%, -50%);
        text-align: center;
      }

      .search-container .search-box {
        display: flex;
      }

      .search-container img {
        margin-bottom: 30px;
      }

      .search-container .search-box input {
        width: 512px;
        height: 16px;
        padding: 12px 16px;
        font-size: 16px;
        margin: 0;
        vertical-align: top;
        outline: 0;
        box-shadow: none;
        border-radius: 10px 0 0 10px;
        border: 2px solid #c4c7ce;
        background: #fff;
        color: #222;
        overflow: hidden;
        box-sizing: content-box;
        -webkit-tap-highlight-color: transparent;
      }

      .search-container .search-box button {
        cursor: pointer;
        width: 112px;
        height: 44px;
        line-height: 41px;
        line-height: 42px;
        background-color: #ad2a27;
        border-radius: 0 10px 10px 0;
        font-size: 17px;
        box-shadow: none;
        font-weight: 400;
        border: 0;
        outline: 0;
        letter-spacing: normal;
        color: white;
      }

      body {
        background: no-repeat center / cover;
        background-color: #edf0f5;
      }
    </style>
  </head>

  <body>
    <div class="container" id="app">
      <div class="search-container">
        <img src="https://www.itheima.com/images/logo.png" alt="" />
        <div class="search-box">
          <input type="text" v-model="words" id="inp" />
          <button>搜索一下</button>
        </div>
      </div>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
      const app = new Vue({
        el: "#app",
        data: {
          words: "",
        },

        // mounted 模板渲染完成,可以开始操作DOM了。
        mounted() {
          document.querySelector("#inp").focus();
        },
      });
    </script>
  </body>
</html>

2. 综合案例 - 小黑记账清单

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- CSS only -->
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
    />
    <style>
      .red {
        color: red !important;
      }

      .search {
        width: 300px;
        margin: 20px 0;
      }

      .my-form {
        display: flex;
        margin: 20px 0;
      }

      .my-form input {
        flex: 1;
        margin-right: 20px;
      }

      .table > :not(:first-child) {
        border-top: none;
      }

      .contain {
        display: flex;
        padding: 10px;
      }

      .list-box {
        flex: 1;
        padding: 0 30px;
      }

      .list-box a {
        text-decoration: none;
      }

      .echarts-box {
        width: 600px;
        height: 400px;
        padding: 30px;
        margin: 0 auto;
        border: 1px solid #ccc;
      }

      tfoot {
        font-weight: bold;
      }

      @media screen and (max-width: 1000px) {
        .contain {
          flex-wrap: wrap;
        }

        .list-box {
          width: 100%;
        }

        .echarts-box {
          margin-top: 30px;
        }
      }
    </style>
  </head>

  <body>
    <div id="app">
      <div class="contain">
        <!-- 左侧列表 -->
        <div class="list-box">
          <!-- 添加资产 -->
          <form class="my-form">
            <input
              type="text"
              class="form-control"
              placeholder="消费名称"
              v-model.trim="billName"
            />
            <input
              type="text"
              class="form-control"
              placeholder="消费价格"
              v-model.trim.number="billPrice"
            />
            <button type="button" class="btn btn-primary" @click="add">
              添加账单
            </button>
          </form>

          <table class="table table-hover">
            <thead>
              <tr>
                <th>编号</th>
                <th>消费名称</th>
                <th>消费价格</th>
                <th>操作</th>
              </tr>
            </thead>
            <tbody>
              <tr v-for="(item,index) in list" :key="item.id">
                <td>{{index+1}}</td>
                <td>{{item.name}}</td>
                <td>{{item.price}}</td>
                <td><a href="javascript:;" @click="del(item.id)">删除</a></td>
              </tr>
              <!-- <tr>
              <td>2</td>
              <td>大衣</td>
              <td class="red">199.00</td>
              <td><a href="javascript:;">删除</a></td>
            </tr> -->
            </tbody>
            <tfoot>
              <tr>
                <td colspan="4">消费总计: {{totalPrice}}</td>
              </tr>
            </tfoot>
          </table>
        </div>

        <!-- 右侧图表 -->
        <div class="echarts-box" id="main"></div>
      </div>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
      /**
       * 接口文档地址:
       * https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058
       *
       * 功能需求:
       * 1. 基本渲染
       * 2. 添加功能
       * 3. 删除功能
       * 4. 饼图渲染
       */
      const app = new Vue({
        el: "#app",
        data: {
          list: [],
          creator: "caihaili",
          billName: "",
          billPrice: "",
        },
        created() {
          /* const res = await axios.get('https://applet-base-api-t.itheima.net/bill', { params: { creator: this.creator } })
        // console.log(res.data.data)
        this.list = res.data.data */
          this.render();
        },
        mounted() {
          this.mychart = echarts.init(document.querySelector("#main"));
          this.mychart.setOption({
            title: {
              text: "消费账单列表",
              // subtext: 'Fake Data',
              left: "center",
            },
            tooltip: {
              trigger: "item",
            },
            legend: {
              orient: "vertical",
              left: "left",
            },
            series: [
              {
                name: "消费账单",
                type: "pie",
                radius: "50%",
                data: [
                  { value: 1048, name: "Search Engine" },
                  { value: 735, name: "Direct" },
                  { value: 580, name: "Email" },
                  { value: 484, name: "Union Ads" },
                  { value: 300, name: "Video Ads" },
                ],
                emphasis: {
                  itemStyle: {
                    shadowBlur: 10,
                    shadowOffsetX: 0,
                    shadowColor: "rgba(0, 0, 0, 0.5)",
                  },
                },
              },
            ],
          });
        },

        methods: {
          async render() {
            const res = await axios.get(
              "https://applet-base-api-t.itheima.net/bill",
              { params: { creator: this.creator } }
            );
            // console.log(res.data.data[1].price)
            this.list = res.data.data;

            this.mychart.setOption({
              series: [
                {
                  /* data: [
                  { value: 1048, name: 'Search Engine' },
                  { value: 735, name: 'Direct' },
                  { value: 580, name: 'Email' },
                  { value: 484, name: 'Union Ads' },
                  { value: 300, name: 'Video Ads' }
                ] */
                  data: this.list.map((item) => ({
                    value: item.price,
                    name: item.name,
                  })),
                },
              ],
            });
          },

          async add() {
            /* this.list.unshift({
            id: +new Date(),
            name: this.billName,
            price: this.billPrice,
          }) */
            if (this.billName === "" || this.billPrice === "") {
              alert("内容不能为空");
              return;
            }
            // axios简写时, post方法不用写data{}, 直接写键对值数据
            await axios.post("https://applet-base-api-t.itheima.net/bill", {
              // id: +new Date(),
              name: this.billName,
              price: this.billPrice,
              creator: this.creator,
            });
            this.render();
            this.billName = "";
            this.billPrice = "";
          },

          async del(id) {
            await axios.delete(
              `https://applet-base-api-t.itheima.net/bill/${id}`
            );
            this.render();
          },
        },

        computed: {
          totalPrice() {
            return this.list.reduce((sum, item) => {
              return (sum += item.price);
            }, 0);
          },
        },
      });
    </script>
  </body>
</html>

3. 工程化开发入门

3.1 工程化开发和脚手架

/* 
  1. 开发Vue的两种方式
    - 核心包传统开发模式:基于html / css / js 文件,直接引入核心包,开发 Vue。
    - 工程化开发模式:基于构建工具(例如:webpack)的环境中开发Vue。
  2. 工程化开发模式优点:
    提高编码效率,比如使用JS新语法、Less/Sass、Typescript等通过webpack都可以编译成浏览器识别的ES3/ES5/CSS等

  3. 脚手架Vue CLI
    Vue CLI 是Vue官方提供的一个全局命令工具
    可以帮助我们快速创建一个开发Vue项目的标准化基础架子。【集成了webpack配置】

  4. 使用步骤:
    1. 全局安装(只需安装一次即可) yarn global add @vue/cli 或者 npm i @vue/cli -g
    2. 查看vue/cli版本:vue --version
    3. 创建项目架子:vue create project-name(项目名不能使用中文)
    4. 启动项目:yarn serve 或者 npm run serve(命令不固定,找package.json)
*/

3.2 项目运行流程

3.3 组件化

3.4 组件注册

<template>
  <!-- <vue 回车可生成框架 -->
  <!-- template 只允许有一个根元素 -->
  <div class="app">
    <!-- 3. 使用组件 组件名+Tab 补充尖括号 -->
    <HmHeader></HmHeader>
    <HmMain></HmMain>
  </div>
</template>

<script>
// 1. 导入
import HmHeader from "./components/HmHeader.vue";
import HmMain from "./components/HmMain.vue";

export default {
  // 2. 注册组件(局部)
  components: {
    HmHeader,
    HmMain,
  },
};
</script>

<style>
.app {
  width: 400px;
  height: 600px;
  background-color: blueviolet;
  padding: 10px;
  box-sizing: border-box;
  margin: 0 auto;
}
</style>

4. 综合案例 - 小兔鲜首页 - 拆分组件

Alt+Shift 多光标,Shift+左右箭头 多光标选中

5. 作业

5.1 BOSS直聘薪资分析-综合实战

5.2 Saas系统布局-变形题

5.3 重构百度云盘文件列表-二次开发

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Group FLUX - Beta Sprint Essay4

文章目录 I. SCRUMAchievements from yesterday’s stand-up meeting to the presentKey Features Demonstrated in Beta PM ReportBurnup mapRunning image of our current program I. SCRUM Achievements from yesterday’s stand-up meeting to the present Zhong Haoyan: …

c++-----------------类和对象(中)

1.类的默认成员函数 默认的成员函数就是用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认的成员函数。一个类我们在不写的情况下编译器会自动生成以下6个默认的成员函数&#xff0c;这6个最重要的是前面4个&#xff0c;后面的了解一下就可以了。默认成员函数很…

Qt中的异步相关类

Qt中的异步相关类 今天在学习别人的项目时&#xff0c;看到别人包含了QFuture类&#xff0c;我没有见过&#xff0c;于是记录一下。 直接在AI助手中搜索QFuture,得到的时Qt中异步相关的类。于是直接查询一下Qt异步中相关的类。 在Qt中&#xff0c;异步编程是一个重要的概念&…

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…

爬虫案例学习6

获取淘宝商品数据2024-12-18 参考学习&#xff1a; 大佬博客 视频教程 通过搜索发现&#xff0c;数据是通过发送请求过来的&#xff0c;不是静态存在源代码的 所以我们需要请求这个接口获取数据&#xff1a;比如标题&#xff0c;价格&#xff0c;图片等信息 https://h5api.m…

Linux学习——9_Ubuntu Linux操作系统

Ubuntu Linux操作系统 Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shuttleworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布 Ubuntu是一个以桌面应用为主的Linux发行版操作系统 Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区…

springboot449教学资源共享平台(论文+源码)_kaic

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统教学资源共享平台信息管理难度大&#xff0c;容错率低&am…

各向同性重建(3D荧光图像)

文章目录 一、基本知识1.1、各向同性&#xff08;isotropic&#xff09; 各向异性&#xff08;anisotropic&#xff09;1.2、像素尺寸 像素间距 像素分辨率1.3、点扩散函数&#xff08;PSF&#xff09;1.3.1、高斯函数 二维高斯PSF1.3.2、二维高斯PSF&#xff1a;代码生成 …

计算机毕业设计论文指导

计算机毕业设计论文指导 计算机毕业设计辅导一站式&#xff01;太香了&#x1f4aa; [赞R][赞R][赞R]嗨喽&#xff01;计算机专业的宝子们&#xff01; 计算机毕设辅导专业靠谱的他来了&#xff01;&#xff01; 是不是还在为选题程序不会做而感到苦难&#xff1f; 论文没思路赶…

【Windows版】opencv 和opencv_contrib配置

一、参考资料 &#xff08;四十一&#xff09;CMakeVSopencv/opencv_contrib 环境配置 从源码安装&#xff2f;penCV&#xff0c;使用python windowsvscodeopencv源码安装配置 二、关键步骤 1. opencv与opencv_contrib版本对齐 下载 opencv 下载 opencv_contrib opencv…

如何制作搞笑配音视频?操作方法

在数字娱乐盛行的今天&#xff0c;搞笑配音视频凭借其独特的幽默感和创意&#xff0c;在网络上赢得了大量观众的喜爱。如果你也想尝试制作一部让人捧腹的搞笑配音视频&#xff0c;那么请跟随以下步骤&#xff0c;从撰写搞笑文案到视频配音剪辑&#xff0c;一步步打造你的作品。…

C++手动实现一个HashMap

1.HashMap原理 参考我的博客&#xff1a;https://blog.csdn.net/Revendell/article/details/110009858 开链法&#xff1a;STL的hashtable便是采用开链法解决冲突。这种做法是在每一个表格元素中维护一个list&#xff1a;散列函数为我们分配某一个list&#xff0c;然后我们在…

threejs+vue3+js旋转词云

title: threejs date: 2024-12-11 09:50:41 tags: threes Threejs 双行可展示旋转词云显示。 一、简单案例——旋转球体 以下代码使用vue3jsthreejs技术站进行的搭建&#xff0c;其中包含了场景创建、相机创建、渲染器创建、物体材创建等相关流程&#xff0c;构建了一个简单…

RocketMQ源码分析(四) 延迟消息源码分析

0.前文 RocketMQ源码分析&#xff08;三&#xff09; 消费者 RocketMQ源码分析&#xff08;二&#xff09; 生产者 RocketMQ源码分析&#xff08;一&#xff09;broker启动&remoting抽象 1. 概述 RocketMQ的延迟消息是指消息发送到Broker后&#xff0c;不会立即被消费者…

嵌入式单片机中对应GPIO外设详解实现

一、GPIO外设详解 大家可以看到,函数库开发的时候外设的使用流程都是一样的,接下来就讲解一下细节。 l定义一个外设的结构体变量 变量命名规则 PPP_InitTypeDef PPP_InitStructure; 每个外设都有对应的结构体,结构体的定义一般都是存放在每个外设的头文件内,比如GPIO外…

C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

目录 说明 效果 模型 项目 ​编辑 代码 参考 下载 其他 说明 百度网盘AI大赛-表格检测的第2名方案。 该算法包含表格边界框检测、表格分割和表格方向识别三个部分&#xff0c;首先&#xff0c;ppyoloe-plus-x 对边界框进行预测&#xff0c;并对置信度较高的表格边界…

智源研究院与腾讯达成战略合作,推动大模型技术前沿探索和应用落地

2024 年 12 月 18日&#xff0c; 智源研究院与腾讯签署战略合作协议&#xff0c;双方将在大模型研发、人工智能技术前沿探索及开源生态建设等领域展开深入合作。智源研究院院长王仲远、副院长兼总工程师林咏华&#xff0c;腾讯集团高级执行副总裁、云与智慧产业事业群总裁汤道生…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

[SAP ABAP] ALV报表练习1

销售订单明细查询报表 业务目的&#xff1a;根据选择屏幕的筛选条件&#xff0c;使用 ALV 报表&#xff0c;显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面(部分截图) 完整代码如下所示 主程序(zsd001_437) *&----------------------------------…

Docker日志与监控

一、引言 随着容器技术在生产环境中被广泛应用&#xff0c;Docker容器的日志管理与监控变得尤为重要。在现代应用程序中&#xff0c;容器化的应用通常是由多个容器组成的服务&#xff0c;而容器中的日志与监控则是确保服务健康运行、诊断问题和优化性能的关键。通过日志和监控…