Vue基础Day04组件与cli脚手架

一.核心内容

1.任务1:天知道

任务1:天知道

2.什么叫组件

把某个界面或者说某个小功能,封装起来就叫组件(就是对html css js的一个综合封装),组件也是Vue的实例,所以它也有自己的data和methods以及生命周期钩子等

组件开发特点:可复用,同时会简化代码结构,易于维护,同时利于多人协同开发等。

3.安装单文件组件所需要依赖

3.1 安装脚手架

  • 安装vue-cli 脚手架

    • 在cmd命令窗口输入(在任意的路径都可以)
    npm install -g @vue/cli
    
  • 安装成功检测在cmd命令窗口输入:
vue  -V    // 注意 是大写的 V 。如果安装成功会返回:@vue/cli 4.0.5类似这样的版本信息

3.2 安装常见错误

如果 vue -V无法显示版本信息,说明安装失败

  • 解决方案:

    • 方案1:更换网络环境:有线,换无线,无线换4G

    • 方案2:更换安装的工具

    1. cnpm安装

      • 先安装淘宝镜像

        npm install -g cnpm --registry=https://registry.npm.taobao.org
        
      • cnpm安装vue-cli:

         cnpm install -g @vue/cli
        
    2. yarn安装 :

      • 先安装yarn

         npm install -g yarn 
        
      • yarn安装vue-cli

         yarn global add @vue/cli
        
  • 方案3:清除npm缓存,重新安装
  1. npm cache clean -f      //清除npm缓存
    
  2. 重新执行安装的命令

  3. 在用脚手架搭建vue项目时,提示:无法加载文件 C:\Users\电脑用户名\AppData\Roaming\npm\vue.ps1,因为在此系统禁止运行脚本

    这是你笔记本禁止运行脚本,解决办法

    命令: set-ExecutionPolicy RemoteSigned

无法加载文件 C:\Users\电脑用户名\AppData\Roaming\npm\vue.ps1

3.3 安装单文件组件.依赖包

安装单文件组件依赖包(安装完成vue-cli后进行这一步)

  • npm安装的用:
npm install @vue/cli-service-global -g
  • cnpm安装的用:
cnpm install @vue/cli-service-global -g
  • yarn安装的用:
yarn global add @vue/cli-service-global

注意:如果 前面用yarn的人就一直用yarn,不要用yarn装完vue-cli,又用npm装其它插件,这样有可能 会出问题,尽量都是同步一个安装,就是以前用npm,后面就一直用npm,以前用yarn 后面就一直用yarn

4.单文件组件使用

4.1 单文件组件结构

  • 把每个组件都放到一个独立的 vue文件.vue

  • 文件三大部分: templatescriptstyle ,快捷键快速生成: <vue>

    <template>
        1. 写html结构的
        2. 注意这里的html部分【必须有一个根标签,用作 vue挂载】
    </template>
    
    <script>
        Vue实例(VueModel + Model)
        1. 写逻辑的,data、methods、生命周期钩子、计算属性等等代码都写在这个部分
      2. 注意这里的data不再是一个对象,在组件里,data将会是一个函数,return一个对象
    </script>
    
    <style>
        1. 写样式的
      2. 在css中的导入外部css(主体使用):`@import url(./babel.css);`
    </style>
    

4.2 单文件组件的运行

  • 在cmd窗口该vue文件根目录下输入vue serve 文件名.vue

  • 注意点

    • template 里 html 必须用一个标签全包住
    • 组件里没有el,组件是无需挂载到哪的,里面已经有template是它的使用的html了
    • data在组件里面是一个function,return 一个对象
<template>
  <div>
    <button @click="msg='讨厌,死鬼~~'">按钮</button>
    <button @click="showLove('你好呀~')">{{msg}}</button>
  </div>
</template>

<script>
export default {
  // 1.组件 不需要指定 el,直接 挂载 template 的根节点
  // el:'',

  // 2.组件 中 data 写作函数,并 返回 参数对象
  data() {
    return {
      msg: "hello"
    };
  },

  // 3.组件 中 methods 和 钩子函数 语法和 普通vue中相同
  methods: {
    showLove(value) {
      alert(value);
    }
  },
  created() {
    // this.alertEvent(123); // 报错 :TypeError: this.alertEvent is not a function
    // 组件中 钩子函数 访问 window成员,不能省略 window.
    window.console.log(this);
  }
};
</script>

<style>
@import "./main.css";

button {
  width: 100px;
}
</style>

<style>
/* 引入 外部css 
   在css中的导入:
          @import url(./babel.css);
   在js中的导入
          import "./babel.css"
*/
@import "./babel.css";
button {
  width: 100px;
}
</style>

5.组件中使用其它组件

如何在一个组件中引入其它组件,实现一个组装。

5.1 三步法

如:在 组件 Father.vue 中 导入 组件 Son.vue

<template>
  <div>
    <!--3.使用组件-->
    <组件别名></组件别名>
  </div>
</template>

<script>
//1.导入其它组件 
`import 组件别名 from "Son.vue"`

//2.注册组件
export default {
  components: {
    组件别名,     //注册的组件都写在components对象下。
  }
}
</script>

6.组件中使用插件

以 axios 为例

6.1 三步法

  1. 装包(安装外部插件)

    npm i axios //到相应目录下执行该命令    
    
  2. 导包(在单文件组件中导入外部插件)

    import axios from "axios" // 注意 可以不加后缀
    
  3. 用包(在相应代码位置使用)

    使用和以前一样,该怎么用还是怎么用

    axios({
     url:"xxx"
    }).then(res=>{
    })
    

    DEMO

    <template>
      <div>
        <input type="text" v-model="searchValue" />
        <button @click="getMusic">点我</button>
        <ul>
          <li v-for="(item, index) in songs" :key="index">{{item.name}}</li>
        </ul>
      </div>
    </template>
    <script>
    // 导包
    import axios from "axios";
    export default {
      data() {
        return {
          searchValue: "", //input框的值
          songs: []
        };
      },
      methods: {
        getMusic() {
          // 使用,以前怎么用,现在还怎么用
          axios({
            url: "https://autumnfish.cn/search?keywords=" + this.searchValue,
            method: "get"
          }).then(res => {
            this.songs = res.data.result.songs;
            window.console.log(this.songs);
          });
        }
      }
    };
    </script>
    <style>
    </style>
    

7.组件间的传值

如果A组件中引入了B组件 ,这样我们称A组件为父组件,B为子组件

7.1 父组件传值给子组件

  • 在子组件标签上定义一个ref属性

      <组件名 ref="xxx"></组件名> 
    
  • 在需要给子组件传值的地方写入:

    this.$refs.xxx   //这就代表了子组件xxx的vue实例
    //这里xxx代码标签中定义的ref属性名这里就可访问到子组件里面的data属性与methods方法
    //如要修改子组件里面data里的某个值:          this.$refs.xxx.子组件里data属性名
    //如果需要调用子组件里面methods里某个方法:   this.$refs.xxx.子组件里面methods里方法名   
    

7.2 子组件传值给父组件

    this.$parent    //这就代表父组件的vue实例
    //如要修改父组件里面data里的某个值:         this.$parent.父组件里data属性名
    //如果需要调用父组件里面methods里某个方法:   this.$parent.父组件里面methods里方法名   

注意:ref获取到的dom信息在这里与document.getElementById是有本质 区别的

//两个组件,这个是father.vue
<template>
  <div>
    <button @click="btnClick">点我获取数据</button>
    <div>你选中的当前歌曲:{{localSong}}</div>
    <son ref="son" id="son"></son>
  </div>
</template>
<script>
// 组件使用,导包,注册,使用
//1:导包
import axios from "axios";
import son from "./son.vue";
export default {
  data() {
    return {
      songs: [],
      localSong: ""
    };
  },
    //2:注册
  components: {
    son
  },
  methods: {
    btnClick() {
      window.console.log("ref访问:", this.$refs.son.$el);
      window.console.log("原生访问:", document.getElementById("son"));
      //要调接口,是不是要使用axios
      //装包,导包,用包
      axios({
        url:
          "https://autumnfish.cn/search?keywords=神话&_t=" + Math.random() * 100
      }).then(res => {
        //   父组件传递子组件值,在子组件上定义一个ref,通过this.$refs.名字,我们就能访问子组件的实例,也就是可访问子组件data属性与methods方法
        this.$refs.son.songs = res.data.result.songs;
        this.$refs.son.alertEvent();
        window.console.log(res.data.result.songs);
      });
    }
  }
};
</script>
<style>
</style>
//son.vue
<template>
  <ul>
    <li v-for="(item, index) in songs" :key="index" @click="liCLick(item.name)">{{item.name}}</li>
  </ul>
</template>
<script>
// 子组件访问父组件里的data与methods更简单,只需要this.$parent就够了
export default {
  data() {
    return {
      songs: []
    };
  },
  methods: {
    liCLick(name) {
      this.$parent.localSong = name;
      window.console.log("访问父组件:", name, this.$parent);
    },
    alertEvent() {
      alert(123);
    }
  }
};
</script>
<style>
</style>

二.核心案例

1.播放器-simple

image.png
  • 接口:

http://183.237.67.218:3000/

http://183.237.67.218:3000/search?keywords= 神话 搜索歌曲时接口获取音乐列表

http://183.237.67.218:3000/song/url?id=310574 获取音乐url id来自于上一接口详情

  • 分析
  1. 搜索功能
    1. input框:v-model @keyup.enter="搜索事件"
    2. 搜索按钮 @click ="搜索事件"
    3. 搜索事件
      1. 使用axios
        1. npm i axios 安装 axios
        2. 导入axios import axios from 'axios'
        3. 使用axios
      2. 使用axios调用接口获取歌曲列表数据
      3. 将获取到的数据渲染出来
        1. v-for
      4. 点击歌曲列表
        1. 在li上绑定点击事件
          1. @click="播放功能(传递歌曲id)"
        2. 通过点击事件查找歌曲的url
          1. axios调用接口获取歌曲url
      5. 播放歌曲
        1. 将获取到的歌曲url绑定到相应audio的src上 :src
  • 源码:
<template>
  <div class="main">
    <input type="text" v-model="inputValue" @keyup.enter="btnClick" />
    <button @click="btnClick">搜 索 歌 曲</button>
    <ul class="list">
      <li v-for="(item, index) in list" :key="index" @click="getsrc(item.id)">{{item.name}}</li>
    </ul>
    <audio :src="musicSrc" controls autoplay></audio>
  </div>
</template>
<script>
// i
import axios from "axios";
export default {
  data() {
    return {
      inputValue: "",
      list: [],
      musicSrc: ""
    };
  },
  methods: {
    btnClick() {
      axios({
        url:
          "https://autumnfish.cn/search?keywords=" +
          this.inputValue +
          "&t=" +
          Math.random() * 999
      }).then(res => {
        this.list = res.data.result.songs;
        //   打印的时候注意了,语法严格一些了,console.log前面一定要加上window
        window.console.log(res);
      });
    },
    getsrc(id) {
      window.console.log(id);
      axios({
        url: "https://autumnfish.cn/song/url?id=" + id
      }).then(res => {
        this.musicSrc = res.data.data[0].url;
        window.console.log("歌曲url", res);
      });
    }
  }
};
</script>
<style>
* {
  padding: 5px;
  margin: 2px;
  list-style: none;
}
.main {
  width: 600px;
  margin: 0 auto;
  border: 1px solid #0094ff;
  text-align: center;
}
.list {
  width: 90%;
  height: 500px;
  overflow: auto;
}
</style>

二.扩展内容

1.关于事件中的$event

每个点击事件里面都有一个事件对象,在vue中如何去使用该事件对象呢?

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

推荐阅读更多精彩内容