JavaSE精选-Vue

简介: JavaSE精选-Vue

Vue

Vue基础语法

创建对象及插值表达式

<!--    {{}}: 在html语法中就是一个简单字符串 -->
<!--   {{}}: 在vue语法中, 叫插值表达式 -->
<!--   插值表达式: 是一个表达式, 这个表达式中使用到的参数, 要去对应的vue对象中取出  -->
    <div id="root">
        <div>
            {{msg1 + msg2}}
        </div>
    </div>
    <script>
        //  new Vue 创建一个Vue对象
        // 一个Vue对象一旦创建, 会立即检测自己的el属性, 找到对应id的html作用域
        // 和对应的作用域建立'绑定'关系
        // 对应html作用域, 就变成了html + vue语法域
        // 对应的新'绑定'的语法域, 要按照Vue语法重新解释
    //每个页面的根root只能有一个,vue对象也只能有一个
        new Vue({
            el: "#root",
            data: {// 注意: Vue对象的data, 用来保存, 我们给这个Vue对象自定义的参数
                msg1: 123,
                msg2: 1
            }
        })
    </script>

v指令

v-bind: 单向绑定

// v-bind: 单向绑定
// 把Vue对象的一个参数, 通过v-bind绑定到对应语法域的标签的属性上,会被vue对象中的参数影响值,但他不能反作用给vue对象

V-model: 双向绑定: 仅能用于表单元素的value

// v-model: 可以把表达元素的value值, 和对应的vue中参数建立双向联系, 相互影响,常用于input框中

V-text: 给一个标签内部插入文本或者带代码的文本

V-html: 极类似于dom操作的innerText和InnerHTML

V-on: 事件监听

// v-on可以监听事件, 把事件触发之后, 响应到vue对象中
// 注意 v-on: 可以简写成@

V-show: 隐藏和显示

V-if

V-else

V-else-if

两者的区别:如果 v-if不满足条件, 不显示, 意味着不会加载到dom上

v-show无论隐藏和显示, 始终都存在于dom树上, 只不过是通过css来隐藏和显示

V-for: 循环语句,一般用于循环渲染

// V-for: 循环语句
注意1: v-for指令做循环渲染的时候, 它所循环渲染的不仅仅只是遍历的内容, 它还会循环渲染出这个v-for指令所在的多个标签,并且对于每一个标签,都要求有一个唯一的key
        <div v-for="item in list">
            {{item}}
        </div>
   --------------------------------------
        <div>
            zs
        </div>   
        <div>
            ls
        </div>  
        <div>
            wu
        </div>  
标准的写法:
            <div v-for="item in list " :key="item.id">
            {{item.name}} --{{item.age}}
        </div>
            这里要注意,中间要使用:隔开,in可以换成of,没有区别

计算属性和侦听器

计算属性: computed:

指的是一个属性通过其他属性计算而来。可以实时变化

new Vue({
     el: "#root",
     data: {
         num1: 0,
         num2: 0
     },
     computed: {
         sum: function () { //sum会自动调用里面的函数,得到结果
             return parseInt(this.num1) + parseInt(this.num2)
         }
     }
 })

侦听器/监听器

监听一个属性的改变, 触发一个事件,一定要注意是监听属性,和v-on有本质的区别

watch:

new Vue({
            el: "#root",
            data: {
                inpustr: "",
                times: 0
            },
            watch: {
                inpustr: function () {
                   this.times++
                }
            }
        })

模板和组件

模板

template:

一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.

<body>
<!--template:-->
<!--一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.-->
    <div id="root"></div>
    <script>
        // 一个Vue对象一旦创建, 先找el属性, 找到对应的绑定结点对象
        // 再检测自己这个Vue对象是否有模板
        // 如果有, 解析模板创建结点对象, 替换已经对应绑定的(在dom上那个)对象
        new Vue({
            el: "#root",
            data: {
                msg: "zs"
            },
            template: "<div><div @click='f'>{{msg}}</div></div>",
            methods: {
                f: function () {
                    alert("?")
                }
            }
        })
    </script>
</body>

简单理解为:root节点被挂载在vue对象上,创建对象的时候找到该节点,然后发现有模板,就将其替换掉,最终将div替换为

<div><div @click='f'>{{msg}}</div></div>
组件

一个Vue对象, 就是一个组件

component:

组件

template:

一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略.

组件的构建流程(非vue项目中使用):先将组件创建成普通的js对象,里面的属性template,即模板,然后在vue对象中的componens里面进行注册,此时组件就作为root对应的vue对象的子组件,同时也是一个vue对象,再将自定义的组件对象写入root的模板中,这样就会自动读取出来

<script>
        var son1 = {
            template: "<div class='son1'>son1</div>"
        }
        var son2 = {
            template: "<div class='son2'>son2</div>"
        }
        var son3 = {
            template: "<div class='son3'>son3</div>"
        }
        var son4 = {
            template: "<div class='son4'>son4</div>"
        }
        new Vue({
            el: "#root",
            data: {},
            template: "<div class='div-root'><son1></son1><son2></son2><son3></son3><aaa></aaa></div>",
            components: {
                son1: son1,
                son2: son2,
                son3: son3,
                aaa: son4,
            }
        })
    </script>

执行的流程:首先加载root挂载的vue对象,发现有模板,进行替换,又发现有son1标签,html中并没有这个标签,识别为vue语法,然后根据son1中的模板来进行替换

生命周期

一个vue对象从创建到消亡的过程中会自动调用的方法

beforeCreate:function () { //创建对象之前
                console.log("控制台打印:beforeCreate")
            },
            created:function () { //对象创建完成
                console.log("控制台打印:created")
            },
            beforeMount:function () {
                //页面还未被渲染
                console.log(this.$el),
                    console.log("控制台打印:beforeMount")
            },
            mounted:function () {
                //页面渲染完成
                console.log(this.$el),
                    console.log("控制台打印:mounted")
            },
            beforeUpdate:function () { //在更新之前
                console.log("控制台打印:beforeUpdate")
            },
            updated:function () { //更新完毕后
                console.log("控制台打印:updated")
            },
            beforeDestroy:function () { //对象销毁前
                console.log("控制台打印:beforeDestory")
            },
            destroyed:function () { //对象销毁完毕后
                console.log("控制台打印:destroyed")
            }

Vue项目的构建

前后端分离的核心思想:

用户根据url发起请求到前端服务器,然后获得前端代码并解析,在解析的过程中发现需要数据,向后端服务器发起请求,后端从数据库中获取数据并发给用户,用户将前端和数据合在一起形成了带数据的页面

vue项目的构建流程

基础配置(只需安装一次,无需重复进行):
1, 安装node (cnpm)
    npm install -g cnpm --registry=https://registry.npm.taobao.org
2, 安装vue-cli:脚手架工具
    cnpm install -g @vue/cli
  cnpm install -g @vue/cli-init
3, 安装webpack: 模块打包机
  cnpm install -g webpack
    
创建项目:
vue init webpack 项目名(不能为中文)
注意:要选好路径名,可以直接在你想要创建项目的目录下输入cmd快速打开
安装包:cnpm install 此时要注意你安装包的目录是项目所在的根目录
启动这个前端vue项目
命令 npm run dev
关闭这个项目(停止)  命令ctrl + c,  已经关闭

组件之间的传值

父组件向子组件传值

父组件传递: 在子组件定义一个属性, 把父组件的数据通过单向绑定, 绑定到这个属性上

<son1 class="son1" v-bind:username="user.name"></son1>

子组件接收: props专门用来接收父组件的传值

props: ["username"]

注意: props 可以基本上等价看做data, 只不过props专门用来接收父组件的传值, 并且不可修改

使用步骤:首先在组件包下创建子组件的vue对象,并且在属性中写好props参数,然后在App下的子组件模板中写入绑定属性,在使用子组件的时候需要导包进入APP中并完成注册
<son1 class="son1" v-bind:username="user.name" ></son1>
      <son2 class="son2" v-bind:userage="user.age"></son2>
<script>
    import Son1 from "./components/Son1";
    import Son2 from "./components/Son2";
export default {
        data(){
            return{
                user: {
                    name: "zs",
                    age: 18,
                }
            }
        }
</script>  
    
<template>
    <div>
      {{userage}}
    </div>
</template>
<script>
    export default {
        props: ["userage"]
    }
</script>    

写入绑定完成后,子组件中的username和userage属性就受到父组件中user.name和user.age的影响

子组件向父组件传值

子组件传递:

// 向父组件抛出一个方法
this.$emit("addage", 2)

父组件接收

<son1   v-on:addage="adduserage"></son1>

注意:需要在父组件中的子组件模板里面一直监听,使用v-on来监听事件,addage是我们自定义的方法名,adduserage相当于是将监听到的方法重写一个在父类中的名字,然后在父类中完成该方法的调用,注意参数只能写在methods里面,不能写入模板标签中

methods: {
            adduserage: function (num) { //此时的num就是我们传过来的参数2
                this.user.age += num
            }
        }

整体的思想:首先子组件中点击事件触发方法,然后向父组件发出一个名字叫addage参数为2的方法,父组件监听该方法名,并获取该方法,重新命名,这样就可以在父组件中调用了,调用时方法的参数就是从子组件传过来的参数,在父组件中完成对值的修改操作

注意:如果同时调用两个方法,需要在方法名之间用逗号隔开

bus传值

// 单独维护一个中转站传值

1, 创建一个bus文件

最好单独创建一个名为bus的包,专门用来存储bus文件
// 导入vue语法
import Vue from 'vue'
// 根据Vue语法创建一个vue对象
const bus = new Vue()
// 默认暴露这个对象
export default bus

2, 在main,js配置

import bus from './bus'
// 相当于: 给整个项目配置的所有Vue对象配置一个参数: $bus
Vue.prototype.$bus = bus

3, 使用

使用的方法类似于父组件向子组件传值,都是使用方法进行传值

传递值:

this.$bus.$emit("addnum", this.inputnum)

第一个值是方法名,第二个是要传递过去的值,一般调用的是对象中的属性

接收值:

mounted() {
           var _this = this
           this.$bus.$on("addnum",  res => {
               _this.times += parseInt(res)
           })

mounted类似于props,是一个专门用来监听的区域,on表示监听事件,一直监听addnum这个方法,接收到的参数为res(可自定义),=>表示对这个参数来进行处理,相当于lambda里面的对方法体进行传参

axios网络请求

vue如果要引入/使用别的第三方框架:

1, 导包或者导入配置文件

cnpm install axios --save

2, 在main.js配置

import axios from 'axios'
Vue.prototype.$axios = axios

3, 使用

methods: {
        getdata () {
            var _this = this     this.$axios.get("http://115.29.141.32:8084/api/mall/getGoodsByType?typeId=1").then( res => {
                    _this.list = res.data.data
                })
        }
    }
methods: {
    getdata () {
        var _this = this
        var obj = {
            "amount":100,
            "goodsDetailId": 1230,
            "num": 1,
            "state": 0,
            "token": "admin"
        }
        this.$axios.post("http://115.29.141.32:8084/api/mall/addOrder", obj)
    }
}
目录
相关文章
|
3月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
487 0
|
3月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
5月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
663 4
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
486 77
|
5月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
3月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
338 17
|
3月前
|
监控 JavaScript 前端开发
Vue 文件批量下载组件封装完整使用方法及优化方案解析
本文详细介绍了批量下载功能的技术实现与组件封装方案。主要包括两种实现方式:**前端打包方案(基于file-saver和jszip)** 和 **后端打包方案**。前者通过前端直接将文件打包为ZIP下载,适合小文件场景;后者由后端生成ZIP文件流返回,适用于大文件或大量文件下载。同时,提供了可复用的Vue组件`BatchDownload`,支持进度条、失败提示等功能。此外,还扩展了下载进度监控和断点续传等高级功能,并针对跨域、性能优化及用户体验改进提出了建议。可根据实际需求选择合适方案并快速集成到项目中。
323 17
|
3月前
|
JavaScript 前端开发 UED
Vue 手风琴实现的三种常用方式及长尾关键词解析
手风琴效果是Vue开发中常见的交互组件,可节省页面空间、提升用户体验。本文介绍三种实现方式:1) 原生Vue结合数据绑定与CSS动画;2) 使用Element UI等组件库快速构建;3) 自定义指令操作DOM实现独特效果。每种方式适用于不同场景,可根据项目需求选择。示例包括产品特性页、后台菜单及FAQ展示,灵活满足多样需求。附代码示例与资源链接,助你高效实现手风琴功能。
142 10
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
272 8
|
3月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
182 1