vue 0基础学习

一、定义

  • Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
  • Vue.js 模板语法
  • Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
  • Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
  • 结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上。

后台的框架模型:
M(model)模型(操作数据库的方法)
V(view)视图(页面)
C(controller)控制器(协调数据库和模型)

前台的框架模型(是后台框架模型V的信息分类):
M(model)模型(这个页面的数据)
V(view)这个页面的视图html
VM (逻辑,干什么事的思路)

二、安装

我使用的是vue-cli3,使用下列任一命令安装这个新的包:

npm install -g @vue/cli
# OR
yarn global add @vue/cli

安装之后,你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue,看看是否展示出了一份所有可用命令的帮助信息,来验证它是否安装成功。

你还可以用这个命令来检查其版本是否正确:

vue --version

注意:mac安装报错Error: EACCES: permission denied, access '/usr/local/lib/node_modules,原因就是没有权限的问题
原因: 执行命令行命令时没有获得管理员权限
解决方案:在命令行前面添加sudo获取管理员权限,输入管理员密码就行
例如原来的是: npm install -g vue-cli
应该改为:sudo npm install -g vue-cli(vue-cli2)
sudo npm install -g @vue/cli(vue-cli3)
再输入密码就行`

image.png

新建项目1:
image.png

三、vue挂载

之前vue-cli2创建项目后,如果自定义js插件,可以通过
import xxx from 'xxx'
Vue.prototype.$xxx = xxx
将xxx挂载到Vue原型上,但到了cli3中,根据网上资料,现在
import Vue from 'vue' 并不能返回Vue对象,如果还是使用
Vue.prototype.xxx= xxx挂载,那在子组件中也无法通过this.xxx进行调用

cli3中现在是通过createApp创建Vue实例对象,我们需要将js组件引入,通过props的形式传递(axios以前是需要挂载,现在通过VueAxios可以直接use使用)

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import axios from 'axios'
import VueAxios from 'vue-axios'
import gojs from 'gojs'
import xxx from './utils/xxx.js'
createApp(App, { go: gojs,xxx:xxx }).use(store).use(router).use(VueAxios,axios).mount('#app')

在子组件中引用go和xxx

<template>
    <div class="sub">This is an subpage</div>
</template>

<script>
    export default {
        name: 'Sub',
        props: {
            go:Object,//定义prop接收
            xxx:Object //定义prop接收
        },
        mounted(){
            let $ = this.$props.go.GraphObject.make //可直接调用
            this.$props.xxx.post() //可直接调用
        },
        methods:{}
    }
</script>

<style>
</style>

四、第一个案例

//实例化vue 
new Vue({
    // Vue 构造器中有一个el 参数,它是 DOM 元素中的 id,
    //这意味着我们接下来的改动全部在以上指定的 div 内,div 外部不受影响。
    el: "#app",
    //data 用于定义所有的基础数据,数据对象
    //当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。
    //当这些属性的值发生改变时,html 视图将也会产生相应的变化。
    data: {
        msg: "<i>大家好</i>",
        num: 1,
        num1: 10,
        flag: true,
        arr: [1, "hello", 3, "是", 5, 6],
        list: ['one', 'two', 'three'],
        inputValue: "",
        str: ""
    },
    //methods 用于定义的函数,可以通过 return 来返回函数值。
    methods: {
        // 和下面的方法一样,写法不同而已
        // noFlag:function(){},
        noFlag() {
            this.flag = !this.flag;
        },
        asyncStr() {
            this.str = this.inputValue;
            this.inputValue = "";
        }
    }
})

五、插值

数据绑定最常见的形式就是使用 {{...}}(双大括号)的文本插值(插值表达式)插值表达式,用于输出对象属性和函数返回值
例:<h1>{{msg}}</h1>

六、指令

  • 定义
    指令是带有 v- 前缀的特殊属性。
    指令用于在表达式的值改变时,将某些行为应用到 DOM 上
  • v-text:给模板进行赋值,相当于innerText
    例:<h1 v-text="msg"></h1>
  • v-html:使用 v-html 指令用于输出 html 代码,相当于innerHtml
    例:<h1 v-html="msg"></h1>

插值表达式,v-text,v-html的区别:
1、插值表达式存在闪烁的问题;
2、v-text和v-html是全部替换,{{}}是可以进行部分替换;
3、v-html可以解析HTML标签,v-text和{{}}不可以;

  • v-bind:绑定属性
    class 与 style 是 HTML 元素的属性,用于设置元素的样式,我们可以用 v-bind 来设置样式属性。
    Vue.js v-bind 在处理 class 和 style 时, 专门增强了它。表达式的结果类型除了字符串之外,还可以是对象或数组。
    例:v-bind:属性="变量"
    <a href="#" v-bind:title="num">哈哈</a>
    简写:
    :属性="变量"
    <a href="#" :title="num">哈哈</a>

  • v-on:事件监听
    vue的事件应该写在vue实例的Methods对象当中。
    通常情况下,我们需要使用一个方法来调用 JavaScript 方法。
    v-on 可以接收一个定义的方法来调用。
    例:
    v-on:事件名="方法名"
    <button v-on:click="noFlag">按钮</button>
    简写:
    @事件名="方法名"
    <button @click="noFlag">按钮</button>

  • v-model:双向数据绑定
    在 input 输入框中我们可以使用 v-model 指令来实现双向数据绑定,只可以用在表单元素上
    v-model 指令用来在 input、select、textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,根据表单上的值,自动更新绑定的元素的值
    input type="text/password/number/radio/checkbox/hidden……"
    select
    textarea
    例:
    <input type="text" v-model="inputValue">
    <input type="button" v-on:click="asyncStr()">
    <h1>{{str}}</h1>

  • v-for:迭代(循环)
    可以迭代数组 对象 数组对象
    vue的列表渲染,即for循环
    例:
    当循环数组时,
    <li v-for="(item,index) in arr"></li>
    item表示数组里的数据,index表示下标,arr表示要循环的数组
    当循环对象时,
    <li v-for="(value, key, index) in object"></li>
    value表示值,key表示键,index表示下标,object表示要循环的对象
    注意的是 在vue2.0之后要给迭代的元素绑定key属性 key的属性可以是唯一的数字或者字符串必须和v-bind一块用
    <ul>
    <li v-for="(item,index) in arr" v-bind:key="index"></li>
    </ul>

  • v-show v-if:条件渲染
    v-show和v-if都是通过布尔值来控制元素
    v-show 是通过css操控显示或隐藏,即改变display的属性值
    v-if 不符合条件的数据,不渲染
    例:
    <h1 v-show="flag">{{num1}}</h1>
    <h1 v-if="flag">{{num1}}</h1>

七、修饰符:

修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
用法:@事件名.修饰符="方法名"

  • .stop 阻止冒泡
  • .prevent 阻止事件的默认行为
  • .capture添加事件侦听器时使用事件捕获模式先执行外面的 再执行里面的
    <div class="box" @click.capture="test">
    <input type="button" :title="title+1" value="点击" @click.stop="tip">
    </div>
  • .self 只当事件在该元素本身比如不是子元素)触发时触发回调
    .self与.stop的区别:.self只是能确保本身被触发,stop能阻止所有元素的冒泡
  • .once 事件只触发一次
    <a href="http://www.baidu.com" @click.prevent.once="chang()">点击</a>
    阻止默认事件只能触发一次

八、简易购物车:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <script src="vue.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
    <div id="app">
        <!-- v-model双向绑定数据 -->
        <p>商品名称:<input type="text" v-model="name"></p>
        <p>商品价格:<input type="number" v-model="price"></p>
        <!-- v-on:事件名="方法名" -->
        <p><input type="button" value="添加" @click="add"></p>
        <p><input type="button" value="全部删除" @click="removeAll"></p>
        <p><input type="button" value="正删除" @click="removeStart"></p>
        <p><input type="button" value="倒删除" @click="removeEnd"></p>
        <p>请输入搜索的关键字:<input type="text" v-model="search"></p>
        <table>
            <thead>
                <tr>
                    <th>商品序号</th>
                    <th>商品名称</th>
                    <th>商品价格</th>
                    <th>商品数量</th>
                    <th>商品小计</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <!-- 将数据循环遍历到页面上 -->
                <tr v-for="(item,index) in list" v-show="item.name.includes(search)">
                    <td>{{index+1}}</td><!-- 序号 -->
                    <td>{{item.name}}</td><!-- 商品名 -->
                    <td>{{item.price}}</td><!-- 商品价格 -->
                    <!-- 商品数量改变,给按钮添加事件 -->
                    <td><button @click="item.count -=1 ">-</button><span>{{item.count}}</span><button
                            v-on:click="item.count += 1">+</button></td>
                    <td>{{item.price*item.count}}</td><!-- 小计 -->
                    <td><button v-on:click="remove(index)">删除</button></td>
                </tr>
            </tbody>
        </table>
        <!-- 合计,调用合计的方法,方法有返回值 -->
        <h1>合计:{{all()}}</h1>
    </div>
</body>
<script>
    //实例化vue对象
    new Vue({
        // Vue 构造器中有一个el 参数,它是 DOM 元素中的 id,
        //这意味着我们接下来的改动全部在以上指定的 div 内,div 外部不受影响。
        el: '#app',
        //data 用于定义所有的基础数据,数据对象
        //当一个 Vue 实例被创建时,它向 Vue 的响应式系统中加入了其 data 对象中能找到的所有的属性。
        //当这些属性的值发生改变时,html 视图将也会产生相应的变化。
        data: {
            price: 0, //v-model双向绑定数据,绑定商品单价的那个表单
            name: '', //v-model双向绑定数据,绑定商品名称的那个表单
            list: [], //数组
            search: '', //v-model双向绑定数据,绑定搜索的那个表单
        },
        //methods 用于定义的函数,可以通过 return 来返回函数值。
        methods: {
            //添加
            add() {
                //向数组中添加数据,如果要调用vue对象data里的数据,必须使用this调用
                this.list.push({
                    name: this.name, //添加name为上面data数据里的name
                    price: this.price, //添加price为上面data数据里的price
                    count: 1, //定义初始数量
                })
                this.name = '' //将商品名称表单内容清空
                this.price = 0 //将商品单价表单数量清0
            },
            //删除,删除时,需要传入下标,锁定要删除的数据
            remove(index) {
                this.list.splice(index, 1) //删除本条数据
            },
            //全部删除
            removeAll() {
                this.list.splice(0, this.list.length) //获取到list的长度,全部删除
            },
            //正着删
            removeStart() {
                this.list.shift() //shift(),将数组的第一个元素删除
            },
            //倒着删
            removeEnd() {
                this.list.pop() //pop(),将数组的最后一个元素删除
            },
            //合计
            all() {
                var he = 0 //定义变量用来存储合计数据
                //遍历list数组
                for (var i in this.list) {
                    //将每一条数据里的单价*数量,加入变量he里
                    he += this.list[i].price * this.list[i].count
                }
                return he //返回合计数据
            },
        },
    })
</script>
</html>

九、过滤器(filter):

定义:
Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化。过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持)。过滤器应该被添加在 JavaScript 表达式的尾部,由“管道”符号指示:
过滤器分为两种,全局过滤器和局部过滤器
过滤器的调用有一个就近原则 先调用局部 在调用全局

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <div id="app">
    <input type="text" v-model="msg">
    <!-- 调用过滤器: -->
    <!-- {{变量|管道符}}   -->
    <h1>{{msg | big}}</h1>
  </div>
</body>
<script src="vue.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
  // 1.定义全局过滤器:
  // 在创建 Vue 实例之前全局定义过滤器。
  // Vue.filter(“过滤器名”,function(需要过滤的字符串,参数列表){
  // 处理需要过滤的字符串然后 然后返回
  // }
  //全局的过滤器,定义在实例化vue对象之前
  Vue.filter("big", function (str) {
    var arr = str.split("").reverse();
    str = arr.join("");
    return str;
  })
  var vm = new Vue({
    el: "#app",
    data: {
      msg: ""
    },
    // 2.定义局部过滤器:
    // 在一个组件的选项中定义本地的过滤器。
    // Filters:{过滤器名(function(需要过滤的字符串){
    // 处理需要过滤的字符串然后 然后返回
    // })
    // }
    //局部的过滤器,定义在实例化vue对象里面
    filters: {
      big(str) {
        var start = str.slice(0, 1).toLocaleUpperCase();
        var end = str.slice(1);
        return start + end;
      }
    }
  })
</script>
</html>

十、自定义指令(directive)

定义:
除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。比如聚焦输入框
指令名 在定义的时候不带 v- 调用的带v-
自定义指令分为两种,全局指令和局部指令。
钩子函数:
一个指令定义对象可以提供如下几个钩子函数 (均为可选);
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 。

vue-cli3关闭eslint校验

image.png
image.png

移动端H5部分区域缩放并移动

https://blog.csdn.net/qq_39197547/article/details/93379257

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343