首页 > 其他分享 >Vue学习三:生命周期和工程化开发

Vue学习三:生命周期和工程化开发

时间:2023-09-12 21:35:20浏览次数:32  
标签:生命周期 name price 50px item Vue 工程化 echarts

一、Vue生命周期

Vue生命周期就是一个Vue实例从创建到销毁的过程

生命周期四个阶段:1、创建 2、挂载 3、更新 4、销毁

Vue生命周期函数(钩子函数)

Vue生命周期过程中,会自动运行一些函数,被称为[生命周期钩子]→让开发者可以在[特定阶段]运行自己的代码。

创建阶段其实就是开辟存放数据的存储空间(这时存放的一般是空字符串等默认数据)。当空间开辟好后我们可以使用created这个钩子,在函数里面向后端发送请求获取初始数据,然后赋值给我们的响应式数据。挂载阶段就是创建页面,创建页面中的DOM元素,并将数据渲染到我们的页面上。当我们第一次打开页面时,前两个周期就已经完成了。当我们修改数据时,就进入到更新阶段,更新前视图、数据不变,更新后视图、数据改变。控制台可以使用实例.$destroy销毁Vue实例,销毁后页面依然存在不过已经没有vue操控了只是一个静态页面。

我们主要使用的还是created和mounted这两个钩子,一个获取初始渲染数据,一个获取dom元素。获取数据的方法一样可以封装在methods方法中,需要的时候直接调用就可以了(比如获取初始化数据;事件执行后改变后台数据,需重新获取数据并赋值)。

二、echarts

官网:https://echarts.apache.org/zh/index.html

cdn:<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>

具体如何使用可以看官方文档

案例阿龙记账清单(测试接口使用的是黑马的,请求axios,图表echarts)。

功能需求:
1.基本渲染
(1)立刻发送请求获取数据created
(2)拿到数据,存到data的响应式数据中
(3)结合数据,进行渲染v- for
(4)消费统计=>计算属性
2.添加功能
(1) 收集表单数据v-model
(2)给添加按钮注册点击事件,发送添加请求
(3)需要重新渲染
3.删除功能
(1) 注册点击事件,传参传id
(2)根据id发送删除请求
(3)需要重新渲染
4.饼图渲染
(1)初始化一个饼图 echarts.init(dom) mounted钩子实现
(2)根据数据实时更新饼图 echarts. setOption(option)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="./vue.js"></script>
        <link rel="stylesheet" href="./layui/css/layui.css"  media="all">
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
        <style>
            table{
                width: 600px;
                height: 300px;
                margin: 50px 50px;
                text-align: center;
            }
            tr{
                border-bottom: 1px solid black;
            }
            form{
                margin: 50px 50px;
            }
            #main{
                width: 600px;
                height: 300px;
                margin: 50px 50px;
                border: 1px solid black;
            }
        </style>
    </head>
    <body>
        <div id="box01">
            <form>
                <input v-model.trim="name" type="text" placeholder="消费名称"/>
                <input v-model.number="price" type="text" placeholder="消费价格"/>
                <button @click="add" type="button">添加账单</button>
            </form>
            <table>
                <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><button @click="del(item.id)" type="button">删除</button></td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <td>消费总计:{{totalPrice}}</td>
                    </tr>
                </tfoot>
            </table>
            <div id="main">
                
            </div>
        </div>
        <script>
            const app = new Vue({
                el:'#box01',
                data:{
                    list:[],
                    name:'',
                    price:''
                },
                computed:{
                    totalPrice(){
                        return this.list.reduce((sum,item) => sum += item.price,0)
                    }
                },
                created(){
                    this.getList()
                },
                mounted(){
                    this.myChart = echarts.init(document.querySelector('#main'))
                    this.myChart.setOption({
                        title: {
                          text: '消费账单列表',
                          left: 'center'
                        },
                        tooltip: {
                          trigger: 'item'
                        },
                        legend: {
                          orient: 'vertical',
                          left: 'left'
                        },
                        series: [
                          {
                            name: '消费账单',
                            type: 'pie',
                            radius: '50%',
                            data: [
                            ],
                            emphasis: {
                              itemStyle: {
                                shadowBlur: 10,
                                shadowOffsetX: 0,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                              }
                            }
                          }
                        ]
                    })
                },
                methods:{
                    async getList(){
                        let msg = await axios.get('https://applet-base-api-t.itheima.net/bill',{
                            params:{
                                creator:'阿龙'
                            }
                        })
                        this.list = msg.data.data
                        this.myChart.setOption({
                            series: [
                              {
                                data:this.list.map(item => ({value:item.price,name:item.name}))
                              }
                            ]
                        })
                    },
                    async add(){
                        let res = await axios.post('https://applet-base-api-t.itheima.net/bill',{
                            creator:'阿龙',
                            name:this.name,
                            price:this.price
                        })
                        this.getList()
                    },
                    async del(id){
                        let res = await axios.delete(`https://applet-base-api-t.itheima.net/bill/${id}`)
                        this.getList()
                    }
                }
            })
        </script>
        <script src="./layui/layui.js" charset="utf-8"></script>
    </body>
</html>
View Code

 

标签:生命周期,name,price,50px,item,Vue,工程化,echarts
From: https://www.cnblogs.com/panglinglong/p/17697851.html

相关文章

  • 使用element-plus组件在vue中引入分页功能
    1、组件的引入<el-paginationbackgroundlayout="prev,pager,next"page-size="6":total="60"></el-pagination>2、存在问题就是,现在页码并不能与每页的内容相互对应解决方式:page用来表示确认每一页是否点击到,正式......
  • OpenTiny Vue组件库实现跨框架(vue2、vue3、react、solid)
    本文由TinyVue组件库核心成员郑志超分享,首先分享了实现跨框架组件库的必要性,同时通过演示demo和实际操作向我们介绍了如何实现一个跨框架的组件库。前言前端组件库跨框架是什么?前端组件库跨框架是指在不同的前端框架(如React、Vue、Solid等)之间共享和复用组件的能力。这种能力可以让......
  • vue3.*安装axios具体步骤
    在项目的命令行处使用命令进行axios的安装npminstallaxiosvue-axios--legacy-peer-deps--save其余的命令可能会报错;......
  • 基于vue制作的动画组件loading起来
    ......
  • vue实现动态导航栏的设置
    1、点击某个导航栏即切换到某个页面1、为el-menu标签加上router属性2、在页面中添加router-view标签,动态渲染我们自己选择的router3、el-menu-item标签的index值即为要跳转的页面地址呈现效果:2、为页面设置选中状态--此时点击选中是有状态的,但是初始化的时候,就不会有什......
  • 软件测试生命周期
    软件测试生命周期是规范整个软件测试过程的指导性纲要,它给出一个测试项目开始到结束的工作流程,如图2.4所示。(1)获取测试需求。从软件开发需求规格说明书中获取软件测试需求,明确测试对象与范围,了解用户具体需求,编制测试需求文档。(2)编写测试计划。根据需求规格说明书、测试需求文档......
  • vue 嵌套全屏iframe 能有效避开返回两次才能返回上一个路由的问题
    <template> <divclass="home">  <iframeref="iframe"class="iframe"frameborder="no"></iframe> </div></template><script>import{ get_doctor_info, statistics, ......
  • vue 学习
    1.给对象动态添加属性和值varobj={   name:"jack",   age:"18"}第一种:Vue.set(obj,'sex','18');第二种:this.$set(this.obj,'score',90);第三种:obj.score=100;直接赋值的方式不能触发Vue的响应式系统。如果我们需要在模板中使用动态添加的属性,建议使用Vue.set......
  • Vue3中使用pinia全局状态管理库
    ❝本期介绍一下pinia在vue3中的简单使用,以及如何使用pinia实现多页面状态共享。❞什么是piniaPinia是一个用于Vue应用程序的轻量级状态管理库。与vuex的区别pinia是vue3的官方状态管理库,vuex是vue2的官方状态管理库pinia更加轻量级pinia能更好的配合Vue3与TSpinia的使用比Vuex简......
  • docker部署springboot+vue项目环境安装及部署流程
    后端项目打jar包修改及配置项1、修改配置文件application-prod.yml中的mysql配置和redis配置2、切换Maven为生产模式3、Maven打包4、拿到打包后的jar 包5、拿到jar包之后在Linux中使用nohupjava-jarjeecg-system-start-3.5.0.jar>catalina.out2>&1&命令即可启动项......