Code前端首页关于Code前端联系我们

vue基本使用

terry 2年前 (2023-09-08) 阅读数 168 #Vue

简介

vue:用于创建用户界面的渐进式框架。

如何进步

clipboard.pngclipboard.png
可以理解为对应:

  1. 非常简单的网站
  2. 放大页面
  3. SPA(一页申请)
  4. vuex 数据管理
  5. 脚手架 vue-cli

单页申请

  • 定义:

页面 -> HTML,因此一页 -> 只有一个 HTML 文件

  • 特点
  1. 页面交互不刷新页面
  2. 加载的公共资源不需要重复加载(首页以外的页面通过异步组件注册)

属性

  1. 易于使用:开始了解 HTML、css、js。
  2. 灵活性:一个蓬勃发展的生态系统,可以在库和完整框架之间自由扩展。
  3. 高效:最小 20 kb + gzip 大小,超快虚拟 DOM,无忧优化。

易于使用

// 引入cdn
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>

<div id="app">
    {{ a }}
</div>
<script>
    const vm = new Vue({
        el: '#app',
        data: {
            a: 10,
        }
    })
</script>
 

语法

v-绑定和 v-on

  • v-bind 绑定属性
v-bind == :
// 完整语法
<a v-bind:href="url">...</a>
// 缩写
<a :href="url">...</a>
 
  • v-on 事件监听器
v-on == @
// 完整语法
<a v-on:click="doSomething">...</a>
// 缩写
<a @click="doSomething">...</a>
 
<div id="app">
    <img :src='imgUrl' />
    <button @:click='clickBtn()'></button>
</div>

<script>
    data(){
        return {
            imgUrl: '...',
        }
    } ,
    methods: {
        clickBtn(){
            // to do...
        }
    }
</script>
 
绑定类,样式
  • 类绑定
:class='[redClass,blueClass,...]';

:class='{redClass: true,blueClass: false,...}';

:class='[{redClass: true},blueClass]';
 
    时尚装订
:style="{width: widthClass,border: '1px solid red'}";

:style="[{width: widthClass},imgStyle]"
 

v-if 和 v-show

  • 条件渲染:控制元素的显示和隐藏

注意:如果你不需要div,v-if你可以使用模板; v-show无法使用

  • 差异
  1. v-if 受控的拆除/添加房屋。
  2. v-showdom风格控制显示/隐藏(显示)
  3. 经常切换显示/隐藏 使用 v-show;使用v-if
  4. 仅判断一次
  • computedv-for
    • 渲染列表:基于数组的渲染列表

    按键类型:数字、字符串;特别的;特点:可以提高页面性能

    arr: (item,index) in arr
    
    <ul>
        <li v-for="item in arr">{{ item }}</li>
        
        // index 数组的索引
        <li v-for="(item,index) in arr">{{ item }} -- {{ index }}</li>
    </ul>
     
    obj: (value,key,index) in obj
    
    <ul>
        <li v-for="value in obj">{{ value }}</li>
        
        // value 属性名,key 属性值,index 索引
        <li v-for="(value,key,index) in obj">{{ value }} -- {{ key }} -- {{ index }}</li>
    </ul>
     
    num: num in number
    
    <p v-for="item in 10">{{ item }}</p> // 1 ... 10
     
    str: str in string
    
    <p v-for="str in 'fuj'">{{ str }}</p> // f u j
     

    v型

    • 双向数据绑定:基于数据的视图、基于视图的数据

    注意:v-model实际上是:value + @input的语法糖。

    // 视图驱动数据:改变视图中input的数据,使得p中的数据随之改变
    <div id="app">
        <input type="text" :value="value" @input='handleInput' />
        <p>{{ value }}</p>
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                value: 'fj', // 数据驱动视图:数据在视图中显示
            },
            methods: {
                handleInput(e) {
                    this.value = e.target.value;
                }
            }
        })
    </script>
     
    // checked: true/false
    <input type="checkbox" v-model='checked' />
    
    // checkList: [html,css]
    <input type="checkbox" value="html" v-model="checkList" />
    <input type="checkbox" value="css" v-model="checkList" />
    
    // radioStr: 'html'/'css'
    <input type="radio" value='html' v-model='radioStr' />
    <input type="radio" value='css' v-model='radioStr' />
    
    // selected: 'html'/'css'
    <select v-model="selected">
        <option value="html">html</option>
        <option value="css">css</option>
    </select>
     

    计算跟踪属性和计算监听器

    vue中数据搜索顺序:数据、方法、计算

    • methods:写一些逻辑的时候,触发事件的时候;封装函数时
    • computed:当您想要获取新数据时
    • watch:当更改某些数据以执行某些操作时
    <div id="app">
        // methods
        {{ desc() }}
        // computed 注意此时 desc 不是写成 desc()
        {{ desc }}
        // watch
        {{ desc }}
    </div>
    <script>
        const vm = new Vue({
            el: '#app',
            data: {
                name: 'fj',
                age: '16',
            },
            methods: {
                // 页面重新渲染,造成数据改变,无论执行否 desc,都会执行一次 desc。造成页面性能不好
                desc() {
                    return `name: ${this.name},age: ${this.age}`;
                }
            },
            computed: {
                desc() {
                    return `name: ${this.name},age: ${this.age}`;
                }
            },
            watch: { // 如果监听的内容多的话,用watch也不合适。
                name() { // 想监听哪个数据,就把哪个数据作为函数写在里面
                    this.desc = `name: ${this.name},age: ${this.age}`;
                }
            },
        })
    </script>
     

    生命周期

    1. beforeCreate:组件实例化之前执行的函数(可以写一些加载效果)
    2. created:组件创建完成,但是页面还没有显示(需要的数据一般都写在这里),跟踪数据中的数据。
    3. beforeMount:连接组件之前,页面仍然没有显示,但是虚拟DOM已经配置好了
    4. mounted:连接组件并执行该方法后,会显示该页面。监视页面 DOM 模型渲染的完成情况。
    5. beforeUpdate:更新组件之前,页面仍然没有更新,但是虚拟DOM已经配置好了
    6. updated:组件更新,执行该方法,显示更新后的页面。在
    7. 方法中执行方法后监视 DOM 的变化
    8. beforeDestory:销毁组件之前
    9. destoryed:组件损坏

    在首页加载时运行的钩子:创建之前,创建,连接之前,安装

    axios 数据请求

    // 安装 axios
    cnpm i axios --save-dev
     
    • 本地使用
    // 所用页面
    import axios from 'axios'
    
    axios.get(url,{}).then(res=>{
        // ...
    })
     
    • 全球使用
    // main.js
    import axios from 'axios'
    Vue.prototype.$axios = axios
    axios.defaults.baseURL = '...com'
    ...
    
    // 页面中
    this.$axios.posturl,{}).then(res=>{
        // ...
    })
     

    脚手架 vue-cli

    脚手架:自动构建项目,使用ES6语法,将js包装压缩成文件,项目文件在环境中而不是浏览器中编译...

    // 查看 node 版本
    node -v     (node > 8.9)
    
    // 如果之前已经安装过旧版本(非3.X)脚手架,需要先卸载旧版本
    npm uninstall vue-cli -g
    
    // 安装脚手架,用于生成项目
    npm install -g @vue/cli
    
    // 快速原型开发,编译.vue文件
    npm install -g @vue/cli-service-global
    // 运行 vue文件
    vue serve App.vue(文件名)
    
    // 查看 vue-cli 版本
    vue -V
    
    // 如果仍然需要使用旧版本的 vue init 功能,可以全局安装一个桥接工具
    npm install -g @vue/cli-init
    
    // 利用脚手架搭建项目
    vue create vue-app
    
    // 运行
    npm run dev
    
    // 打包
    npm run build
    
    // vsCode 安装插件名字:Vetur
     
    // 安装时一些插件
    babel: ES6转为ES5;
    eslint: 规范代码风格;
    TypeScript: 简称TS,写一些大型项目或者框架的时候用;
    pwa: 初始进入网页耗费流量,再进就不耗费了,相当于缓存;
    Router: 切换页面;
    Vuex: 管理数据、状态的时候用到;
    CSS Pre-..: css预处理语言:sass、less...;
     

    clipboard.pngclipboard.png

    // 目录结构
    node_modules: 安装的包
    public: 相当于根目录,可以放一些图片、json(绝对路径,不会经过webpack处理)
    (接口未提供时,可以在这里面造些假数据,直接通过根目录就能访问)
    .gitignore: 里面放不用上传到git的一些文件;
    babel.config: 配置babel的;
    package.json: 项目的信息;
    package-lock.json: 依赖包文件里面包的一些信息;
    README: 对项目的一些描述;
    
    src/assets: 放置一些资源,图片、css(相对路径,经过webpack处理)
    src/components: 放置一些组件;
    src/App.vue: 主入口的一个组件
    src/main.js: 
    
    经过webpack处理后会生成哈希类型,不会被缓存,会实时更新。
     
    // main.js
    import Vue from 'vue'; // 表示从包里面引入;
    import App from './App.vue'; // 表示从页面引入;
    Vue.config.productionTip = false; // 生产环境下没有命令行的警告;
    new Vue({
        render: h=>h(App), // 虚拟对象转换为真实对象
    }).$mount('#app')  // 函数实例化,并挂载在#app上
     
    // 打包时根目录下新增:vue.config.js
    module.exports = {
      publicPath: process.env.NODE_ENV === 'production'
        ? './'
        : '/'
    }
    // 在vue-cli.3.3版本后 baseUrl被废除了,因此这边要写成 publicPath。
     

    其他

    参考

    1. ref:DOM对象引用是一个对象,组件引用是组件实例的对象;
    2. 当引用同名时,后面添加的引用会覆盖该引用引用的前一个和最后一个元素;
    3. 添加参考。引用值类型是数组。该数组包含组件的 DOM 对象/实例。
    <div ref='box'>123</div>
    console.log(this.$refs.box.innerHTML); // 123
     

    $nextTick

    vm.a = 20;
    console.log(vm.a); // 20
    // 更改数据是同步的,但是更改过后要去视图更新的操作是异步的。
    // 此时页面也是20,但是下面打印10
    console.log(vm.$el.innerHTML); // 10
    
    // 等待dom执行后再执行。
    vm.$nextTick
    vm.$nextTick(()=>{
        console.log(vm.$el.innerHTML); // 20
    })
    
    vm.$mount('#app');    ==  el: '#app';
     

    框架和库的区别

    • 库:将代码收集到开发者可以使用的产品中,开发者可以调用库中的方法来实现自己的功能。 (控制权在你自己手里,想用库就用库,不想用就用原生)

    示例:jQuery、zepto...

    • 框架:为解决某一类问题而开发的产品,根据自身特点为用户提供完整的解决方案。 (掌控在里面,必须遵守里面的规则和方法)

    示例:看、反应...

  • 版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门