前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简学Vue

简学Vue

作者头像
Rochester
发布2020-09-01 10:36:41
2.2K0
发布2020-09-01 10:36:41
举报
文章被收录于专栏:牛人NR牛人NR

本视频教程来自B站@遇见狂神说,有需要的朋友可以去搜索观看他的视频学习。

第一个Vue程序

vue官方:https://cn.vuejs.org/v2/guide/

1.安装vue插件

2.导入 vue.js

代码语言:javascript
复制
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

3.编写view视图层

代码语言:javascript
复制
<!-- View 层 ,模板 -->
<div id="app">
    
</div>
  • 完整代码:
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- View 层 ,模板 -->
<div id="app">
    {{message}}
</div>

<!-- 1.导入vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        // Model : 数据
        data:{
            message:"hello,Vue!"
        }
    });
</script>

</body>
</html>

判断:v-if,v-else,v-else-if

代码语言:javascript
复制
v-if    
v-if-else    
v-else
<!--hexoPostRenderEscape:<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line">* 示例:</span><br><span class="line"></span><br><span class="line">  &#96;&#96;&#96;vue</span><br><span class="line">  &lt;!DOCTYPE html&gt;</span><br><span class="line">  &lt;html lang&#x3D;&quot;en&quot;&gt;</span><br><span class="line">  &lt;head&gt;</span><br><span class="line">      &lt;meta charset&#x3D;&quot;UTF-8&quot;&gt;</span><br><span class="line">      &lt;title&gt;Title&lt;&#x2F;title&gt;</span><br><span class="line">  &lt;&#x2F;head&gt;</span><br><span class="line">  &lt;body&gt;</span><br><span class="line">  </span><br><span class="line">  &lt;div id&#x3D;&quot;app&quot;&gt;</span><br><span class="line">      &lt;h1 v-if&#x3D;&quot;type&#x3D;&#x3D;&#x3D;&#39;A&#39;&quot;&gt;A&lt;&#x2F;h1&gt;</span><br><span class="line">      &lt;h1 v-else-if&#x3D;&quot;type&#x3D;&#x3D;&#x3D;&#39;B&#39;&quot;&gt;B&lt;&#x2F;h1&gt;</span><br><span class="line">      &lt;h1 v-else-if&#x3D;&quot;type&#x3D;&#x3D;&#x3D;&#39;D&#39;&quot;&gt;D&lt;&#x2F;h1&gt;</span><br><span class="line">      &lt;h1 v-else&gt;C&lt;&#x2F;h1&gt;</span><br><span class="line">  &lt;&#x2F;div&gt;</span><br><span class="line">  </span><br><span class="line">  &lt;script src&#x3D;&quot;https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;npm&#x2F;vue&#x2F;dist&#x2F;vue.js&quot;&gt;&lt;&#x2F;script&gt;</span><br><span class="line">  &lt;script&gt;</span><br><span class="line">      var vm &#x3D; new Vue(&#123;</span><br><span class="line">          el:&quot;#app&quot;,</span><br><span class="line">          data:&#123;</span><br><span class="line">              type:&#39;A&#39;</span><br><span class="line">          &#125;</span><br><span class="line">      &#125;);</span><br><span class="line">  &lt;&#x2F;script&gt;</span><br><span class="line">  </span><br><span class="line">  &lt;&#x2F;body&gt;</span><br><span class="line">  &lt;&#x2F;html&gt;</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->

循环:遍历 v-for

v-for 指令可以绑定数组的数据来渲染一个项目列表:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">

    <li v-for="(item,index) in items">
        {{item.message}}---{{index}}
    </li>

</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            items:[
                {message:'silentcow说Java'},
                {message: 'silentcow说前端'},
                {message: 'silentcow说运维'}
            ]

        }
    });
</script>

</body>
</html>
  • 结果
image-20200622122827147
image-20200622122827147

VUE绑定事件:v-on

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <button v-on:click="sayHi">click Me</button>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            message:"silentcow说Java"
        },
        methods:{   //方法必须定义在 Vue 的Methods对象中, v-on 事件
            sayHi:function (event) {
                alert(this.message)
            }
        }
    });
</script>

</body>
</html>

表单输入绑定

官网文档:https://cn.vuejs.org/v2/guide/forms.html#%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95

v-model 指令在表单 及 `` 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

什么是双向数据绑定: v-model

Vue.js是一个MVVM框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了.

文本:

文本同步更新

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    输入的文本:<input type="text" v-model="message"> {{message}}
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            message:"123"
        }
    });
</script>

</body>
</html>

多行文本:

在文本区域插值 ({{text}}) 并不会生效,应用 v-model 来代替。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <textarea v-model="message" placeholder="add multiple lines"></textarea>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            message:"123"
        }
    });
</script>

</body>
</html>

单选按钮:

此处silent可随意书写

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    性别:
    <input type="radio" name="sex" value="男" v-model="silent">男
    <input type="radio" name="se" value="女" v-model="silent">女
    <p>
        选中了谁:{{silent}}
    </p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            silent:''
        }
    });
</script>

</body>
</html>
image-20200622153201445
image-20200622153201445

下拉框

disabled为了适应IOS

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    下拉框:
    <select v-model="selected">
        <option value="" disabled>---请选择---</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
    </select>
    <span>您选择的是:{{selected}}</span>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            selected:''
        }
    });
</script>

</body>
</html>

复选框:

单个复选框,绑定到布尔值:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <input type="checkbox" id="checkbox" v-model="checked">
    <lable for="checkbox">{{checked}}</lable>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            checked:false
        }
    });
</script>

</body>
</html>

多个复选框,绑定到同一个数组:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <input type="checkbox" id="san" value="张三" v-model="checkedNames">
    <lable for="san">张三</lable>
    <input type="checkbox" id="si" value="李四" v-model="checkedNames">
    <lable for="si">李四</lable>
    <input type="checkbox" id="wu" value="王五" v-model="checkedNames">
    <lable for="wu">王五</lable>
    <p>
        结拜兄弟的是:{{checkedNames}}
    </p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    var vm = new Vue({
        el:"#app",
        data:{
            checkedNames:[]
        }
    });
</script>

</body>
</html>
image-20200622155125117
image-20200622155125117

注意v-model 会忽略所有表单元素的 valuecheckedselected attribute 的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值

组件:

组件基础

  • Vue.component():注册组件
  • my-component-li:自定义组件的名字
  • template:组件的模板
  • v-for="item in items":遍历Vue实例中定义的名为items的数组,并创建同等数量的组建;
  • v-bind:item="item":将遍历的item项绑定到组建中props定义的名为item属性上; = 号左边的item为props定义的属性名,右边的为item in items中遍历的 item 项的值。
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- View视图层 模板-->
<div id="app">
    <!--组件:传递给组件中的值:props-->
    <silent v-for="item in items" v-bind:cow="item"></silent>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    //定义一个Vue组建
    Vue.component("silent",{
        props:['cow'],
        template:'<li>{{cow}}</li>'
    });

    new Vue({
        el:"#app",
        data:{
            items:["java","linux","前端"]
        }
    });

</script>

</body>
</html>

Axios异步通信:

简介:

官方:https://www.kancloud.cn/yunye/axios/234845

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

特性:

  • 从浏览器中创建 XMLHttpRequests
  • 从 node.js 创建 http 请求
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求数据和响应数据
  • 取消请求
  • 自动转换 JSON 数据
  • 客户端支持防御 XSRF

CDN

代码语言:javascript
复制
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
  • 实例:
    • 先伪造数据 data.json
代码语言:javascript
复制
{
  "name": "silentcow说Java",
  "url": "https://www.csdn.net/",
  "page": 1,
  "isNonProfit": true,
  "address": {
    "street": "龙高街道",
    "city": "陕西咸阳",
    "country": "中国"
  },
  "links": [
    {
      "name": "bilibili",
      "url": "https://www.bilibili.com/"
    },
    {
      "name": "silentcow说Java",
      "url": "https://www.bilibili.com/"
    },
    {
      "name": "百度",
      "url": "https://www.baidu.com/"
    }
  ]
}
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <!-- v-clock:解决闪烁问题-->
    <style>
        [v-clock]{
            display: none;
        }
    </style>

</head>
<body>

<div id="app" v-clock>
    <div>{{info.name}}</div>
    <div>{{info.address.street}}</div>

    <a v-bind:href="info.url">点我</a>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<!--导入axios-->
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.19.2/axios.min.js"></script>
<script type="text/javascript">

    var vm = new Vue({
        el:"#app",
        data(){
            return{
                //请求的返回值参数合适,必须和json字符串一样
                info:{
                    name:null,
                    address:{
                        street:null
                    }
                    ,url:null
                }
            }
        },
        mounted(){  //钩子函数,链式编程,ES6 新特性
            axios.get('../data.json').then(response=>(this.info=response.data));
        }
    });

</script>

</body>
</html>
<!--hexoPostRenderEscape:<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"># 计算属性</span><br><span class="line"></span><br><span class="line">计算属性的重点突出在&#96;属性&#96;两个字上(属性是名词),首先它是个&#96;属性&#96;其次这个属性有&#96;计算&#96;的能力(计算是动词),这里的&#96;计算&#96;就是个函数;简单点说,它就是-个能够将计算结果缓存起来的属性(将行为转化成了静态的属性),仅此而已;可以想象为**缓存!**</span><br><span class="line"></span><br><span class="line">&#96;&#96;&#96;vue</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html lang&#x3D;&quot;en&quot;&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;meta charset&#x3D;&quot;UTF-8&quot;&gt;</span><br><span class="line">    &lt;title&gt;Title&lt;&#x2F;title&gt;</span><br><span class="line">&lt;&#x2F;head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line"></span><br><span class="line">&lt;div id&#x3D;&quot;app&quot;&gt;</span><br><span class="line">    &lt;p&gt;currentTime1:&#123;&#123;currentTime1()&#125;&#125;&lt;&#x2F;p&gt;      &lt;!--调用方法必须加括号--&gt;</span><br><span class="line">    &lt;p&gt;currentTime2:&#123;&#123;currentTime2&#125;&#125;&lt;&#x2F;p&gt;</span><br><span class="line">&lt;&#x2F;div&gt;</span><br><span class="line"></span><br><span class="line">&lt;script src&#x3D;&quot;https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;npm&#x2F;vue&#x2F;dist&#x2F;vue.js&quot;&gt;&lt;&#x2F;script&gt;</span><br><span class="line">&lt;script&gt;</span><br><span class="line">    var vm &#x3D; new Vue(&#123;</span><br><span class="line">        el:&quot;#app&quot;,</span><br><span class="line">        data:&#123;</span><br><span class="line">            message:&quot;hello&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        methods:&#123;</span><br><span class="line">            currentTime1:function () &#123;</span><br><span class="line">                return Date.now();  &#x2F;&#x2F;返回一个时间戳</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        computed:&#123;  &#x2F;&#x2F;计算属性,methods,computed 方法名不能重名,重名之后,只会调用methods的方法</span><br><span class="line">            currentTime2:function () &#123;</span><br><span class="line">                this.message;</span><br><span class="line">                return Date.now();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;);</span><br><span class="line">&lt;&#x2F;script&gt;</span><br><span class="line"></span><br><span class="line">&lt;&#x2F;body&gt;</span><br><span class="line">&lt;&#x2F;html&gt;</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->

注意: methods和computed里的东西不能重名 说明:. ● methods: 定义方法,调用方法使用currentTime1(). 需要带括号 ● computed: 定义计算属性,调用属性使用currentTime2, 不需要带括号: this.message是为了能够让currentTime2观察到数据变化而变化 ● 如何在方法中的值发生了变化,则缓存就会刷新!可以在控制台使用vm. message-“qinjiang” ,改变下数据的值,再次测试观察效果!

结论:

调用方法时,每次都需要进行计算,既然有计算过程则必定产生系统开销,那如果这个结果是不经常变化的呢?此时就可以考虑将这个结果缓存起来,采用计算属性可以很方便的做到这一点,计算属性的主要特性就是为了将不经常变化的计算结果进行缓存,以节约我们的系统开销;

内容分发-插槽

Vue.js中我们使用<slot>元素作为承载分发内容的出口,作者称之为 插槽,可以应用在组合组件的场景中。

官方:https://cn.vuejs.org/v2/guide/components-slots.html

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <to-do>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="item in todoItems" :item="item"></todo-items>
    </to-do>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    // slot:插槽
    Vue.component("to-do",{
        template: '<div>\
                        <slot name="todo-title"></slot>\
                            <ur>\
                            <slot name="todo-items"></slot>\
                       </ur>\
                   </div>'
    });

    Vue.component("todo-title",{
        props: ['title'],
        template: '<div>{{title}}</div>'
    });

    Vue.component("todo-items",{
        props: ['item'],
        template:'<li>{{item}}</li>'
    });

    var vm = new Vue({
        el:"#app",
        data:{
            title:"silent系列",
            todoItems:['silentcow说Java','silentcow说前端','silentcow说C++']
        }
    });

</script>

</body>
</html>

自定义事件内容分发:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div id="app">
    <to-do>
        <todo-title slot="todo-title" :title="title"></todo-title>
        <todo-items slot="todo-items" v-for="(item,index) in todoItems"
                    :item="item" v-bind:index="index" v-on:remove="removeItems(index)"></todo-items>
    </to-do>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>

    // slot:插槽
    Vue.component("to-do",{
        template: '<div>\
                        <slot name="todo-title"></slot>\
                            <ur>\
                            <slot name="todo-items"></slot>\
                       </ur>\
                   </div>'
    });

    Vue.component("todo-title",{
        props: ['title'],
        template: '<div>{{title}}</div>'
    });

    Vue.component("todo-items",{
        props: ['item','index'],
        template:'<li>{{index}}---{{item}} <button @click="remove">删除</button> </li>',
        methods:{
            remove:function (index) {
                // this.$emit:自定义事件分发
                this.$emit('remove',index);
            }
        }
    });

    var vm = new Vue({
        el:"#app",
        data:{
            title:"silent系列",
            todoItems:['silentcow说Java','silentcow说前端','silentcow说C++']
        },
        methods: {
            removeItems:function (index) {
                this.todoItems.splice(index,1);//一次删除一个元素
            }
        }
    });

</script>

</body>
</html>

Vue入门小结及常用属性:

核心:数据驱动,组件化

优点:借鉴了AngulaJS 的模块化开发 和 React 的虚拟Dom,虚拟Dom就是把Dom操作放到内存中执行;

常用的属性:

  • v-if
  • v-else-if
  • v-else
  • v-for
  • v-on 绑定事件,简写 @
  • v-model 数据双向绑定
  • v-bind 给组件绑定参数 简写 :

组件化:

  • 组合组件 slot 插槽
  • 组件内部绑定事件需要使用到 this.$emit(“事件名”,”参数”);
  • 计算属性的特性,缓存计算数据

遵循SoC 关注度分离原则,Vue是纯粹的视图框架,并不包含:比如Ajax之类的通信功能,为了解决通信问题,我们需要使用Axios框架做异步通信;

说明:

Vue的开发都是要基于NodeJS,实际开发采用vue-cli脚手架开发,vue-router路由,vuex做状态管理; Vue U,界面我们一般使用ElementUI(饿了么出品)。或者IC E(阿里巴巴出品!)来快速搭建前端项目~

webpack学习使用

配置:

创建webpack.config.js配置文件:

  • entry: 入口文件,指定WebPack用哪个文件作为项目的入口
  • output: 输出,指定WebPack把处理完成的文件放置到指定路径
  • module:模块,用于处理各种类型的文件
  • plugins: 插件,如:热更新、代码重用等
  • resolve:设置路径指向
  • watch: 监听,用于设置文件改动后直接打包

使用webpack

1.创建项目

2.创建一个名为modules 的目录,用于防止JS 模块等资源文件

3.在modules下创建模块文件,如hello.js,用于编写JS模块相关代码

代码语言:javascript
复制
// 暴露一个方法
exports.sayHi = function () {
    document.write("<h1>silentcow学ES6</h1>");
};

4.在modules下创建一个名为main.js的入口文件,用于打包时设置entry 属性

代码语言:javascript
复制
var hello = require("./hello");
hello.sayHi();

5.在项目目录下创建webpack.config.js配置文件,使用webpack命令打包

代码语言:javascript
复制
module.exports = {
    entry: './modules/main.js',
    output: {
        filename:"./js/bundle.js"
    }
};
image-20200623202357971
image-20200623202357971

6.在项目目录下创建HTML页面,如index.html, 导入WebPack打包后的JS文件

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script src="dist/js/bundle.js"></script>
</body>
</html>

7.在IDEA控制台中直接执行webpack;如果失败的话,就使用管理员权限运行即可! 8.运行HTML看效果

image-20200623202614270
image-20200623202614270

文章作者: silentcow

文章链接: http://silentcow.cn/2020/08/06/vue/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一个Vue程序
  • 判断:v-if,v-else,v-else-if
  • 循环:遍历 v-for
  • VUE绑定事件:v-on
  • 表单输入绑定
    • 文本:
      • 多行文本:
        • 单选按钮:
          • 下拉框
            • 复选框:
            • 组件:
              • 组件基础
              • Axios异步通信:
                • 简介:
                  • 特性:
                    • CDN
                    • 内容分发-插槽
                    • 自定义事件内容分发:
                    • Vue入门小结及常用属性:
                    • webpack学习使用
                      • 配置:
                        • 使用webpack
                        相关产品与服务
                        内容分发网络 CDN
                        内容分发网络(Content Delivery Network,CDN)通过将站点内容发布至遍布全球的海量加速节点,使其用户可就近获取所需内容,避免因网络拥堵、跨运营商、跨地域、跨境等因素带来的网络不稳定、访问延迟高等问题,有效提升下载速度、降低响应时间,提供流畅的用户体验。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档