vue笔记

118 阅读3分钟

vue

什么是vue

1.构建用户界面

  • 用vue往html页面中填充数据 非常方便

2.框架

  • 框架是一套现成的解决方案 程序员只能遵守框架的规范 去编写自己的业务能力
  • 要学习vue 就是在学习vue框架中规定的用法
  • vue的指令 组件(是对UI结构的复用) 路由 Vuex vue组件库
  • 只有把上面罗列的内容掌握以后 才有开发vue 项目的能力

vue框架的特性

一:数据驱动视图

  • 数据的变化会驱动视图自动更新
  • 好处:程序员只管把数据维护好 那么页面结构就会被vue自动渲染出来

二:双向数据绑定

  • 在网页中 form表单负责采集数据 Ajax负责提交数据
  • js数据的变化会被自动渲染到页面上
  • 页面上表单采集的数据发生变化时 会被vue自动获取到 并更新到js数据中

注意:数据驱动视图和双向数据绑定的底层原理MVVM(Mode数据源,View视图,ViewModel就是vue的实例)

Vue

<!-- 希望Vue能够控制下面这个div 帮我们再把数据填充到div内部 -->
    <div id="app">{{ username }}</div>

    <!-- 1.导入Vue的库文件 在window全局就有了Vue这个构造函数-->
    <script src="./lib/vue-2.6.12.js"></script>
    <!-- 2.创建Vue的实例对象 -->
    <script>
        // 创建Vue的实例对象
        const vm = new Vue({
            // el属性是固定写法 表示当前vm实例要控制页面上的哪个区域 接收的值是一个选择器
            el: '#app',
            // data 对象就是要渲染到页面上的数据
            data: {
                username: 'zhangsan'
            }
        })
    </script>

el属性的使用注意 el直接写标签 只会识别第一个 最外面包裹一个大div即可

vue-cli

单页面应用程序简称 SPA 顾名思义 指的是一个Web网站中只有唯一的一个HTML页面 所有页面的交互都在这唯一的一个页面内完成

vue-cli是Vue.js开发的标准工具 它简化了程序员基于webpack创建工程化的Vue项目的过程

程序员可以专注在撰写应用上 而不必花好几天时间去纠结webpack配置的问题

使用 在终端下运行如下命令 创建指定名称的项目

vue create 项目的名称

1.image.png

  • 第一项 vue3项目
  • 第二项 vue2项目
  • 第三项 手动选择我们要安装哪些功能到vue项目中 建议选择最后一项 按上下键选择

2.image.png 按空格键选择要是否安装 上下键选择要安装的

3.image.png 先创建vue2的项目

4.image.png 选择 Less

5.image.png 选择第一个即可 意为把Babel ESlint等插件的配置项 放到自己独立的文件中

6.创建完成 image.png

7.运行 用上一步的最后两行 终端窗口不能关闭 image.png

vue项目中 src 目录的构成
  1. assets 文件夹:存放项目中用到的静态资源文件
  2. components 文件夹:程序员封装的 可复用的组件 都要放到components 目录下
  3. main.js 是项目的入口文件 整个项目的运行 要先执行 mian.js 4.App.vue是项目的根组件 可以看到的ui解构
vue项目运行的过程
  • 通过main.js把App.vue渲染到index.html的指定区域中
  • App.vue 用来编写待渲染的模板结构
  • index.html 中要预留一个el区域
  • main.js把App.vue渲染到了index.html所预留的区域中
  • Vue实例的$mount方法 作用和el属性完全一样

组件化

  1. 组件化开发:根据封装的思想 把页面上可重用的UI结构封装为组件 从而方便项目的开发和维护
  2. vue是一个支持组件化开发的前端框架 vue中规定 组件的后缀名是 .vue
  3. vue 组件的三个组成部分
  • template->组件的模板结构 只能有一个根元素
  • script->组件的javascript行为
  • style->组件的样式 添加lang="less" 属性启用less语法 加一个scoped属性 不会导致页面冲突
  • 组件中的data必须是一个函数 data(){} 在函数里面 return一个数据对象
<script>
// 默认导出
export default {
  // data 数据源
  //   注意:.vue 组件中的 data 不能像之前一样 不能指向对象
  //   组件中的data必须是一个函数
  //   data: {
  //     username: "zs",
  //   },
  data() {
    //   这个return出去的 {} 中 可以定义数据
    return {
      username: "admin",
    };
  },
  methods: {
    changeName() {
      // 在组件中 this就表示当前组件的实例对象
      console.log(this);
      this.username = "哇哈哈";
    },
  },
  //   当前组件中的侦听器
  watch: {},
  //   当前组件中的计算属性
  computed: {},
  //   当前组件中的过滤器
  filters: {},
};
</script>
使用组件的三个步骤
  1. 使用import语法导入需要组件 import Left from "@/components/Left.vue";
  2. 使用components节点注册组件
export default {
  data() {},
  methods: {},
  components: {
    Left,
    Right
  },};

3.以标签形式使用刚注册的组件 <Left></Left>

  1. 注册全局组件 只需要注册一次 每个都可以用
  2. 在入口文件 mian.js中 通过 Vue.component()方法 注册全局组件
// 导入需要被全局注册的组件
import Count from '@/components/Count.vue'
// 注册组件 第一个参数是组件名称 也就是等会用的标签名 
Vue.component('MyCount', Count)

组件之间的数据共享

1. 父子关系
  • 父组件向子组件共享数据需要使用自定义属性 props

注意 不能修改props中的内容 自定义属性在子组件中声明 父组件只负责绑定子组件属性和传值

<div class="box">
      <!-- 渲染 Left 组件和 Right 组件 -->
      <Left :msg="message" :user="userinfo"></Left>
    </div>
//引入组件
import Left from "@/components/Left.vue";
export default {
  data() {
    return {
      message: "hello 132",
      userinfo: { name: "wsc", age: 18 },
    };
  },
  components: {
    Left,
  },
};
   <p>msg的值是 {{ msg }}</p>
   <p>user的值是 {{ user }}</p>
export default {
  props: ["msg", "user"],
};
  • 子组件向父组件共享数据使用自定义事件 子组件
export default{
  data(){
    return{count:0}
  },
  methods:{
    add(){
    this.count+=1
    //修改数据时通过$emit()触发自定义事件
    this.$emit('numchange',this.count)
     }
  }
}

父组件

<Son @numchange="getNewCount"></Son>
export default{
  data(){
    return{countFromSon:0}
  },
  methods:{
    getNewCount(Val){
      this.countFromSon=Val
    }
  }
}
  1. 兄弟关系 兄弟组件之间的数据共享方案是 EventBus

image.png

  1. 创建eventBus.js模块 并向外共享一个Vue的实例

import Vue from "vue";
export default new Vue();
  1. 在数据发送方 调用bus.$emit('事件名称',要发送的数据) 方法触发自定义事件

 <button @click="send">发送</button>
// 1.导入eventBus.js模块
import bus from "./eventBus.js";
data() {
    return {
      str: "黑云压城城欲摧",
    };
  },
methods: {
    send() {
      // 通过eventBus来发送数据
      bus.$emit("share", this.str);
    },
  },
  1. 在数据接收方调用bus.$on('事件名称',事件处理函数)方法注册一个自定义事件 在数据接收方的creaded生命周期中 调用bus.$on()方法
// 1.导入eventBus.js模块
import bus from "./eventBus.js";

data() {
    return {
      // 接收
      masFromLeft: "",
    };
  },
   created() {
    // 2.为bus绑定自定义事件
    bus.$on("share", (Val) => {
      console.log(Val);
      this.masFromLeft = Val;
    });
  },