预尝试4个小时入门Vue

news2024/11/27 12:40:29

目录

Vue简介

​编辑

第一个vue程序

el挂载点

data数据对象

Vue指令

v-text和v-html

v-on

v-show

v-if

v-bind

v-for

v-model

记事本案例

axios网络请求库

1、安装

2、使用,作一个音乐播放器


均来自黑马教程。

Vue简介

第一个vue程序

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hello world-vue</title>

    <!-- 引入vue.js,开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
</head>

<body>
    <div id="app">
        {{ message }}
    </div>

    <script>
        var app = new Vue({
            // el:'元素选择器' 将new的Vue实例和Dom元素绑定起来,设置vue实例的挂载点
            el: '#app',

            data: {
                message: 'hello world!'
            }
        })
    </script>
    <!--引入vue不可以放这哦-->

</body>

</html>

这边要注意vue.js的引入位置,需要在用到vue之前执行,也就是要在new Vue前执行,我第一次放在后面导致vue is not defined报错。

el挂载点

语法                 el:'元素选择器'

作用                将new的Vue实例和Dom元素绑定起来,设置vue实例的挂载点

作用范围        vue实例只作用于其挂载的的元素以及后代元素。

data数据对象

vue实例的挂载元素中如果有{{}}的话,会被解析并将data对象中的数据渲染进去。

会解析上面的html,一旦解析到有vue的语法,就会自动按照vue的语法将data中的数据渲染进去。

<body>
    <div id="app">
       <b>一名屌丝的基本信息</b><br>
       在干嘛:{{message}}<br>
       院校信息:{{school.name}} <br>
       爱好:{{interest[1]}}
    </div>

    <script>
        var app = new  Vue({
            el:"#app",

            data:{
                // 基本数据类型
                message:"学vue第一天",

                // 对象
                school:{
                    name:"莆田学院",
                    address:"莆田市城厢区",
                    phone:"18120997089"
                },

                // 数组
                interest:["跑步",3,"乒乓球","打游戏"]
                
            }
        })
    </script>
</body>

Vue指令

v-text和v-html

<body>
    <!-- 
        v-text 会将标签体的内容全部替换掉,而且只能原封不动的将data中的数据替换标签体,
        若只想替换部分内容可以用vue的插值语法{{}}

        v-html 也是将标签体中的内容全部替换掉,但是如果data数据中有
                html内容,会先解析好后再替换标签体内容。
     -->

    <div id="app">
        <h1 v-text="message+'!'">一段文本</h1>
        <h2>{{info+"!"}}一段文本</h2>

        <p v-html="content">wen</p>
        <p v-text="content">wen</p>
    </div>

    <script>
        var vue = new Vue({
            el:"#app",

            // 准备一些数据
            data:{
                message:"hello",
                info:"内容",

                content:"<a href='https://www.baidu.com/'>百度</a>"
            }
        })
    </script>
    
</body>

v-on

<body>
    <!-- 
        v-on:事件名="方法名"    指令可以给元素绑定事件,当事件触发后,会执行方法。
        v-on: 可替换为@

        v-on:click  单击事件
     -->
    <div id="app">
        <input type="button" value="提交" v-on:click="method1"></input>

        <p v-on:click="showTime">{{time}}</p>
    </div>


    <script>
        var vue = new Vue({
            el: "#app",

            data: {
                time: "点击查看时间"
            },

            // 定义方法
            methods: {
                method1: function () {
                    alert("你要加油!");
                    console.log("数据:"+this.time);
                },

                showTime: function () {
                    // this可以获取到data对象,this.数据名可以操作数据内容,从而改变dom中的内容,不用像以前操作dom元素来修改内容。
                    var t = new Date();
                    this.time = t;
                }
            }
        })
    </script>

</body>

v-on的补充

<body>

    <!-- 
        v-on:事件名='方法名' 
        对v-on事件绑定的补充:
        1.我们可以给事件触发的方法传参数,前提是在方法的定义处需要定义形参来接收我们的实参.
        2.事件修饰符
         @keyup.enter
         @keyup是键盘事件, .enter给事件添加修饰符,就是当回车时才触发,通过'.xxx'来添加事件修饰符.

     -->
    <div id="app">
        <input type="text"  @keyup.enter="login('小明')">
        <button>登录</button>
    </div>

    <script>
        var app = new Vue({
            el:"#app",
            data:{

            },
            methods:{
                login(userName){
                    alert(userName + "登录成功");
                }
            }
        })
    </script>
</body>

v-show

<body>
    <!-- 
        当v-show后面的表达式值为true时,才显示标签元素,否则隐藏。
        表达式可以直接取到data中的数据。
        这个原理是操作标签的样式:style="display: none;" 实现元素的隐藏。
     -->

    <div id="app">
        <div>
            <img src="../img/monkey.png" v-show="isShow==true">
        </div>
        
<br>
        <button @click="showChange">按我</button>
    </div>

    <script>
        var vue = new Vue({
            el:"#app",
            data:{
                isShow:true
            },
            methods:{
                showChange:function(){
                    this.isShow = !this.isShow;
                }
            }
        })
    </script>
    
</body>

v-if

<body>
    <!-- 
        v-if 和v-show效果一样,都是当表达式的值为true时,才显示。
        
        但是原理不同,v-if是直接操作dom树,删除或添加元素到dom树中。
        当频繁切换显示,使用v-show,v-if直接操作dom树,开销大。
     -->
    <div id="app">
        <span v-if="temp > 3">hello </span>
        <button v-on:click="add">切换显示状态</button>
    </div>

    <script>
        var vue = new Vue({
            el: "#app",
            data: {
                temp: 2
            },
            mehtods: {
                add: function () {
                    this.temp++;
                    console.log(this.temp);
                }
            }
        })
    </script>
</body>

v-bind

<body>
    <!-- 
        v-bind 可以给标签的属性绑定一个data对象中的数据,从而控制标签的属性。
        v-bind 可以省略
    -->

    <div id="app">
        <img v-bind:title="imgTitle" src="http://tva2.sinaimg.cn/large/83e2e207jw1fchpgbeyg8j21c00u0dkb.jpg"
            class="imgStyle" />
        <br>
        <!-- <span v-bind:class="{isActive:textL}">一段文本</span> -->

        <!-- isActive为真才取textL值 -->
        <span v-bind:class="{textL:isActive}" @click="changeClass">一段文本</span>
    </div>


    <script>
        var app = new Vue({
            el: "#app",
            data: {
                imgTitle: "你的名字",
                isActive: true
            },
            methods: {
                changeClass: function () {
                    this.isActive = !this.isActive;
                }
            }
        })
    </script>

</body>

v-for

<body>
    <!-- 
        1.v-for="item in items" 会遍历整个items,item代表每一个数据遍历项.
          v-for="(item,index) in items" item表示每一个数据遍历项,index代表索引值.
        2.v-for作用的标签,有几个遍历项,标签就渲染几次.
        3.使用{{}}插值语法来取数据.
     -->
    <div id="app">
        <h4>周末做什么:</h4>
        <ol>
            <li v-for="todo in todos">{{todo}}</li>
        </ol>

        <h4>无序列表:</h4>
        <ul>
            <li v-for="(item,index) in users" v-bind:title="item.age">
                {{index}} --> {{item.name}}
            </li>
        </ul>

        <button @click="addUser">添加用户</button>
        <button @click="minusUser">减少用户</button>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                // 基本数组
                todos: [
                    "吃饭",
                    "睡觉",
                    "打游戏",
                    "看剧"
                ],

                // 对象数组
                users: [
                    { name: "小明", age: 23 },
                    { name: "小花", age: 21 },
                    { name: "明华", age: 33 }
                ]
            },
            methods:{
                addUser(){
                    this.users.push({name:"某某",age:24})
                },
                minusUser(){
                    this.users.shift();
                }
            }
        })
    </script>
</body>

v-model

<body>

    <!-- 
        v-model用于表单元素和vue数据对象的双向绑定
        1.v-model只能用于表单元素,常见的表单元素有:input(text,button,radio...),select,checkbox...
          v-model双向绑定,vue数据和表单元素数据两者相互影响.
        2.v-bind只是单向绑定,vue数据改变才会改变属性数据,属性数据改变不影响vue数据.
     -->
     <div id="app">
        <!-- <span v-model="message"></span> -->
        <input type="text" v-model="message" @keyup.enter="showData">

        <input type="text" v-bind:value="message" @keyup.enter="showData">
     </div>

     <script>
        var app = new Vue({
            el:"#app",
            data:{
                message:"默认文本"
            },
            methods: {
                showData() {
                    alert("vue实例中的数据:" + this.message);
                },
            },
        })
     </script>
</body>

记事本案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>记事本</title>
    
    <!-- 引入vue.js,开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <style>
        .w{
            padding-left: 26‒;
            margin-left: 38px;
        }
    </style>
</head>
<body>
    <div id="app">
        <h2>小菜鸡记事本</h2>
        <!-- v-model和输入框的value属性绑定,可以用于获取用户的输入. -->
        <input type="text" placeholder="请输入任务" @keyup.enter="addItem()" v-model="inputValue">
        <ul>
            <li v-for="(item,index) in items" @mouseenter="floatDelete" @mouseleave="hideDelete">
               {{index+1+'.'}} {{item}}
               <span v-show="isDelete" @click="deleteItem(index)">x</span>
            </li>

            
        </ul>
        <span v-show="items.length != 0">{{items.length}} items left</span>    <span v-show="items.length != 0" class="w" @click="clear">clear</span>
    </div>
    
    <script>
        var app = new Vue({
            el:"#app",
            data:{
                items:[
                    "吃饭",
                    "睡觉",
                    "打游戏"
                ],
                inputValue:"",
                isDelete:false,
                total: 3
            },
            methods:{
                addItem(){
                    console.log("inputValue:"+this.inputValue);
                    this.items.push(this.inputValue);
                    this.inputValue = "";
                    // console.log("inputValue:"+this.inputValue);
                },
                floatDelete:function(){
                    
                    this.isDelete = true;
                },
                hideDelete(){
                    this.isDelete = false;
                },
                deleteItem(index){
                    this.items.splice(index,1);
                    this.total = this.items.length;
                    if(this.items.length == 0){
                        this.isDelete = false;
                    }
                },
                clear(){
                    this.items.splice(0);
                }
            }
        })
    </script>
</body>
</html>

axios网络请求库

是一个网络请求库,我的理解就是向后台发送请求,返回自己需要的资源。

1、安装

方式一:使用npm下载axios依赖

npm install axios

方式二:在线导入(要保证联网)

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

2、使用,作一个音乐播放器

两种常用的请求:GET POST

axios.get(地址?参数列表).then(function(response){},function(err){})

请求成功则执行前面的函数        失败执行后面的函数

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>悦听player</title>
  <!-- 样式 -->
  <link rel="stylesheet" href="./css/index.css">
  <!-- 开发环境版本,包含了有帮助的命令行警告 -->
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <!-- 官网提供的 axios 在线地址 -->
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>

<body>
  <div class="wrap">
    <!-- 播放器主体区域 -->
    <div class="play_wrap" id="player">
      <div class="search_bar">
        <img src="images/player_title.png" alt="" />
        <!-- 搜索歌曲 -->
        <input type="text" autocomplete="off" v-model="key" @keyup.enter="search" />
      </div>
      <div class="center_con">
        <!-- 搜索歌曲列表 -->
        <div class='song_wrapper'>
          <ul class="song_list">
            <li v-for="song in songs"><a href="javascript:;" @click="play(song.id,song.al.picUrl)"></a>
              <b>{{song.name}}</b> 
              <span><i v-if="song.mv > 0"><img src="./images/mv.png" @click="playMv(song.mv)"></i></span>
            </li>
            <!-- <li><a href="javascript:;"></a> <b>你好</b> <span><i></i></span></li> -->
          </ul>
          <img src="images/line.png" class="switch_btn" alt="">
        </div>
        <!-- 歌曲信息容器 -->
        <div class="player_con" :class="{playing:isPlay}">
          <img src="images/player_bar.png" class="play_bar" />
          <!-- 黑胶碟片 -->
          <img src="images/disc.png" class="disc autoRotate" />
          <img v-bind:src="songPicUrl" class="cover autoRotate" />
        </div>
        <!-- 评论容器 -->
        <div class="comment_wrapper">
          <h5 class='title'>热门留言</h5>
          <div class='comment_list'>
            <dl>
              <dt><img src="./images/person.png" alt=""></dt>
              <dd class="name">盐焗西兰花</dd>
              <dd class="detail">
                绝对值得一听,吹爆
              </dd>
            </dl>
          </div>
          <img src="images/line.png" class="right_line">
        </div>
      </div>
      <div class="audio_con">
        <audio ref='audio' @play="doPlay" @pause="pause" v-bind:src="songUrl" controls autoplay loop
          class="myaudio"></audio>
      </div>
      <div class="video_con" v-show="mvUrl != ''">
        <video controls="controls" :src="mvUrl"></video>
        <div class="mask" @click="closeMv"></div>
      </div>
    </div>
  </div>


  <script src="./js/main.js"></script>
</body>

</html>

var app = new Vue({
    el:"#player",
    data:{
        key:"",
        songs:[],
        songUrl:"",
        songPicUrl:"",
        isPlay:false,
        mvUrl:""
    },
    methods:{
        // 查询歌曲
        search(){
            var that = this;

            axios.get("https://autumnfish.cn/cloudsearch?keywords="+this.key)
            .then(function(response){
                console.log(response.data.result.songs);
                that.songs = response.data.result.songs;
            },function(err){})
        },

        // 获取歌曲播放url
        play(id,url){
            this.songUrl = "https://music.163.com/song/media/outer/url?id="+id+".mp3";
            this.songPicUrl = url;
        },

        doPlay(){
            this.isPlay = true;
        },
        pause(){
            this.isPlay = false;
        },

        playMv(mvId){
            var that = this;
            axios.get("https://autumnfish.cn/mv/url?id="+mvId).then(function(response){
                console.log(response.data.data.url)
                that.mvUrl = response.data.data.url;
            })
        },

        closeMv(){
            this.mvUrl = "";
        }
    }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 Python 编写的 Python 解释器,你会吗?

计算机只能理解机器码。归根结底&#xff0c;编程语言只是一串文字&#xff0c;目的是为了让人类更容易编写他们想让计算机做的事情。真正的魔法是由编译器和解释器完成&#xff0c;它们弥合了两者之间的差距。解释器逐行读取代码并将其转换为机器码。 在本文中&#xff0c;我…

java计算机毕业设计基于安卓Android的儿童疫苗接种管理App

项目介绍 本文讲述了儿童疫苗管理App的设计与实现。结合电子管理系统的特点,分析了儿童疫苗管理App的现状,给出了儿童疫苗管理App实现的设计方案。 本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,在客户端,主要有管理员、医生和用户三个角色可以登录,用户…

【react】JSX基本语法

1、全称 JavaScript XML 2、定义 是react定义的一种类似于XML的JS扩展语法: JS XML本质是React.createElement(component, props, …children)方法的语法糖 3、作用: 用来简化创建虚拟DOM 4、标签名任意 HTML标签或其它标签 5、标签属性任意 HTML标签属性或其它 6、基本语法规…

Python 缩进语法的起源:上世纪 60-70 年代的大胆创意!

上个月&#xff0c;Python 之父 Guido van Rossum 在推特上转发了一篇文章《The Origins of Python》&#xff0c;引起了我的强烈兴趣。 众所周知&#xff0c;Guido 在 1989 年圣诞节期间开始创造 Python&#xff0c;当时他就职于荷兰数学和计算机科学研究学会&#xff08;简称…

SAP ABAP CDS view 里 INNER JOIN 和 Association 的区别

最近有朋友在我的知识星球里向我提问&#xff0c;SAP ABAP CDS view 的 INNER JOIN 和 Association 的功能可以理解为一样吗&#xff1f; (关于加入我的知识星球的方式&#xff0c;请移步本文文末) 本文就来聊一聊这个话题。既然 CDS view 里同时支持了 INNER JOIN 和 Assoc…

小伙伴因 unshift 插入数据被批,未曾想到找我诉苦竟梅开二度

背景 事情是这样的&#xff0c;今天小伙伴跟我诉苦&#xff0c;说写的代码被批了&#xff0c;原因是效率太低了&#xff0c;简单问了一下需求&#xff0c;就是将几千条数据倒序插入到数组中&#xff0c;他是通过循环搭配 unshift 实现的&#xff0c;听完我也批了他一顿。 小伙…

ImageNet

标题有点不太对是的 就能用了 这次是说 用有噪声的学生网络进行自我训练提高ImageNet分类 近年来&#xff0c;深度学习在图像识别方面取得了显著的成功。然而&#xff0c;最先进的视觉模型仍然是用监督学习来训练的&#xff0c;这就需要大量的标记图像才能很好地工作。 通过只…

监控易火星版纳管IPv6:IP地址管理V2.0的进化之路

IPv6的使用&#xff0c;不仅能解决网络地址资源数量的问题&#xff0c;而且也解决了多种接入设备连入互联网的障碍。大量IP地址的接入&#xff0c;导致运维人员不得不投入大量精力来解决IP管理分散、非法接入、IP地址错误、IP地址冲突等导致的问题。随之而来的&#xff0c;IP地…

java计算机毕业设计基于安卓Android的校园助手APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把校园助手与现在网络相结合,利用java技术建设校园助手APP,实现校园助手的信息化。则对于进一步提高校园助手发展,丰富校园助手经验能起到不少的促进作用。 校园助手APP能够通过互联网得到广泛的、全面的宣传,让尽可能多的…

Metal每日分享,图像单色滤镜效果

本案例的目的是理解如何用Metal实现图像单色效果滤镜&#xff0c;将图像转换为单色版本&#xff0c;根据每个像素的亮度进行着色&#xff1b; Demo HarbethDemo地址 实操代码 // 去雾效果滤镜 let filter C7Monochrome.init(intensity: 0.83, color: .blue)// 方案1: Image…

Zookeeper[1]-Zookeeper介绍与安装以及集群环境准备

Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 Zookeeper的介绍和安装 Zookeeper客户端使用…

基于Paddle2.4.0训练报错Debug

基于Paddle2.4.0训练报错Debug一、环境简介二、Debug过程错误一Debug错误二Debug错误三Debug更换PaddlePaddle版本三、总结参考文档一、环境简介 本文背景为使用AutoDL网站的租借显卡进行网络训练&#xff0c;训练环境如下&#xff1a; 操作系统&#xff1a;Ubuntu18.04&#…

Springboot内置的工具类之StringUtils

在实际的业务开发中&#xff0c;除了经常有针对对象的判断或操作以外&#xff0c;经常也会遇到的就是字符串的判断和操作。比如判断字符串是否为空、是否以某个字符结尾、去除头部和尾部的空白字符、字符的查找和替换。在Spring的核心包中存在这样一个类org.springframework.ut…

如何保证项目如期上线,测试工程师应该怎么做?

要保证项目按照正常进度发布&#xff0c;需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。1、产品经理频繁修改需求2、开发团队存在技术难题3、测试团队测不完今天我想跟大家聊一下&#xff0c;测试团队如何保证项目按期上线&#xff0c;以及在这个过程中可能遇到…

[附源码]Python计算机毕业设计SSM基于Web课堂签到管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

学生HTML网页作业:基于HTML+CSS+JavaScript画家企业8页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

jvm垃圾处理

1.什么是垃圾 垃圾&#xff1a;没有引用指向的一个对象或者多个对象循环引用但是没有引用指向申请内存方式 c语言&#xff1a;malloc free c:new delete java:new 对象 2、垃圾是如何产生的 垃圾一般在发生引用传递时产生。一块堆内存可以被不同的栈内存所引用&#xff0c;…

DBCO-PEG-SPDP,SPDP-PEG-DBCO,DBCO-聚乙二醇-3-(2-吡啶二硫代)丙酸N-羟基琥珀酰亚胺

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; DBCO-PEG-SPDP中无铜点击反应一直是无催化剂生物共轭的有力工具。 DBCO试剂在水性缓冲液中具有稳定性&#xff0c;可用于以高特异性和反应性标记叠氮化物修饰的生物分子&…

【知识图谱】(task3)知识图谱的存储和查询

note 用图数据库的场景&#xff1a; 高性能关系查询&#xff1a;需要快速遍历许多复杂关系的任何用例&#xff0c;如欺诈检测&#xff0c;社交网络分析&#xff0c;网络和数据库基础设施等&#xff1b;模型的灵活性&#xff1a;任何依赖于添加新数据而不会中断现有查询池的用例…

Linux Kernel 6.0 CXL Core Regs.c 详解

前言 CXL 是一个比较新的技术&#xff0c;所以我研究的内核源码是选了当前比较新的内核版本 linux 6.0。打算将内核关于 CXL 的驱动进行解析一遍&#xff0c;一步一步慢慢来。 在阅读之前&#xff0c;希望读者能有一定的 PCIe 基础知识&#xff0c;精力有限&#xff0c;不能把…