JavaScript-Vue入门

本文主要测分享Vue的一些基础

Vue简介

Vue.js 是一个构建数据驱动的 web 界面的渐进式框架。它的主要目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

下是一些 Vue 的主要特点和概念:

1. 响应式数据绑定
Vue 使用基于 HTML 的模板语法,允许你声明式地将已渲染的 DOM 绑定至底层 Vue 实例的数据。当数据改变时,视图会自动更新。这种数据驱动的方式使得状态管理变得直观而简单。

2. 组件化
Vue 允许你将界面拆分为可重用的组件,每个组件都有自己的逻辑和样式。这使得代码更易于组织和维护,同时提高了代码的复用性。你可以使用 Vue 的单文件组件特性,将模板、逻辑和样式封装在一个 .vue 文件中。

3. 指令
Vue 提供了一套丰富的指令,用于在模板中绑定数据、事件、样式等。例如,v-bind 用于绑定属性,v-on 用于绑定事件处理器,v-if 和 v-show 用于条件渲染等。

4. 生命周期钩子
Vue 实例在其生命周期中有一系列的钩子函数,允许你在不同的阶段执行特定的逻辑。例如,你可以在组件创建时初始化数据,或在组件销毁时清理资源。

5. 路由和状态管理
虽然 Vue 本身并不直接包含路由和状态管理功能,但它与 Vue Router(官方路由库)和 Vuex(官方状态管理库)无缝集成。Vue Router 使得构建单页面应用变得简单,而 Vuex 则提供了一个集中式的存储库,用于管理应用的状态。

创建第一个Vue程序

打开Webstorm,创建一个新项目选择Vue

6565a2b48a0c593cbc8d0edbe2591436.png

然后创建之后根据终端输出提示,执行命令

cd yourproject这个命令用于切换到当前目录下的 datagenerate 文件夹

npm install 安装项目中 package.json 文件里列出的所有依赖。

npm run dev这个命令用于执行 package.json 文件中 scripts 部分定义的 dev 脚本。通常情况下,dev 脚本用于启动项目的开发服务器,这样你就可以在本地浏览器中查看和测试你的应用了。

运行后,打开网页就是如此界面

892eddd70a74b1c6cabe64fb162b0682.png

当然可以直接通过命令创建

要创建一个新的 Vue 项目,首先需要安装 Vue CLI(命令行界面)。确保你已经安装了 Node.js 和 npm,然后在命令行中运行以下命令:

npm install -g @vue/cli

安装完成后,可以使用以下命令创建一个新的 Vue 项目:

vue create my-project

按照提示选择所需的配置选项,如 Babel、TypeScript、CSS 预处理器等。创建完成后,进入项目目录并启动开发服务器:

cd my-project npm run serve

现在,你可以在浏览器中访问 http://localhost:8080 查看你的 Vue 应用程序。

Vue 项目结构

一个典型的 Vue 项目结构如下:

my-project/
├── node_modules/
├── public/
│   ├── favicon.ico
│   └── index.html
├── src/
│   ├── assets/
│   ├── components/
│   ├── router/
│   ├── store/
│   ├── views/
│   ├── App.vue
│   └── main.js
├── .gitignore
├── babel.config.js
├── package.json
└── README.md
  • node_modules/: 存储项目的依赖包。

  • public/: 存放公共文件,如 index.html 和 favicon.ico

  • src/: 存放项目的源代码。

    • assets/: 存放静态资源,如图片、字体等。

    • components/: 存放可复用的 Vue 组件。

    • router/: 存放路由配置文件。

    • store/: 存放 Vuex 状态管理文件。

    • views/: 存放页面级组件。

    • App.vue: 根组件。

    • main.js: 应用程序的入口文件。

  • .gitignore: 指定需要 Git 忽略的文件和目录。

  • babel.config.js: Babel 配置文件。

  • package.json: 项目的元数据和依赖项配置文件。

  • README.md: 项目的说明文档。

Vue基础

Vue实例:Vue应用的根本是一个Vue实例。通过创建一个Vue实例来启动应用。

// 创建一个Vue实例
const app = new Vue({
  el: '#app', // 挂载点,指定Vue实例管理的DOM元素
  data: {
    message: 'Hello, Vue!' // 定义数据
  }
});

Vue 模板语法

Vue 使用基于 HTML 的模板语法,允许你声明式地将数据渲染到 DOM 中。Vue 模板语法包括插值、指令和特殊特性。

插值

可以使用双大括号({{}})在模板中插入数据:

<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!'
    }
  }
}
</script>

指令

指令是带有 v- 前缀的特殊属性,用于在表达式的值改变时,将某些行为应用到 DOM 上。常用的指令包括:

  • v-if:根据表达式的真假值来有条件地渲染元素。

  • v-for:基于数组或对象渲染一个列表。

  • v-bind:动态绑定一个或多个属性,或一个组件 prop 到表达式。

  • v-on:绑定事件监听器。

  • v-model:在表单控件或者组件上创建双向绑定。

示例:

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.id">{{ item.text }}</li>
    </ul>
    <child-component ref="child"></child-component>
    <component :is="currentComponent"></component>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'
import ComponentA from './ComponentA.vue'
import ComponentB from './ComponentB.vue'

export default {
  components: {
    ChildComponent,
    ComponentA,
    ComponentB
  },
  data() {
    return {
      items: [
        { id: 1, text: '项目 1' },
        { id: 2, text: '项目 2' },
        { id: 3, text: '项目 3' }
      ],
      currentComponent: 'ComponentA'
    }
  },
  methods: {
    accessChild() {
      console.log(this.$refs.child)
    }
  }
}
</script>
特殊特性

Vue 提供了一些特殊的模板特性,如 keyrefis 等,用于实现特定的功能。

  • key:用于标识 v-for 循环中的每个节点,以便 Vue 能够跟踪节点的身份,从而重用和重新排序现有元素。

  • ref:用于在父组件中直接访问子组件或 DOM 元素。

  • is:用于动态组件或者避免 HTML 解析限制。

示例:

<template>
  <div>
    <h1>{{ $route.name }}</h1>
    <button @click="goBack">返回</button>
  </div>
</template>

<script>
export default {
  methods: {
    goBack() {
      this.$router.go(-1)
    }
  }
}
</script>

路由配置

Vue Router 是 Vue.js 的官方路由管理器,用于构建单页应用。它允许我们将 URL 映射到组件,实现页面的导航和切换。

安装 Vue Router

要在 Vue 项目中使用 Vue Router,首先需要安装它:

npm install vue-router

配置路由

在 src/router/index.js 文件中配置路由:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: About
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

在上面的代码中,我们导入了 VueRouter 并使用 Vue.use() 方法将其注册为 Vue 插件。然后定义了一个 routes 数组,其中每个对象表示一个路由,包含 pathname 和 component 属性。最后,创建了一个 VueRouter 实例,并将 routes 传递给它。

使用路由

在 src/App.vue 文件中使用 <router-view> 组件来渲染匹配的路由组件:

<template>
  <div id="app">
    <nav>
      <router-link to="/">首页</router-link> |
      <router-link to="/about">关于</router-link>
    </nav>
    <router-view></router-view>
  </div>
</template>

使用 <router-link> 组件创建导航链接,当点击链接时,Vue Router 会自动更新 URL 并渲染对应的组件。

在组件中,可以使用 this.$router 访问路由器实例,使用 this.$route 访问当前路由对象。

示例:

<template>
  <div>
    <h1>{{ $route.name }}</h1>
    <button @click="goBack">返回</button>
  </div>
</template>

<script>
export default {
  methods: {
    goBack() {
      this.$router.go(-1)
    }
  }
}
</script>

响应式原理

当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。

每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把"接触"过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。

const data = { count: 0 };

const vm = new Vue({
  data
});

console.log(vm.count); // 0

vm.count = 1;
console.log(data.count); // 1

组件通信

Props:Props 是你可以在组件上注册的一些自定义 attribute。当一个值传递给一个 prop attribute 的时候,它就变成了那个组件实例的一个 property。

// 子组件
Vue.component('child', {
  props: ['message'],
  template: '<span>{{ message }}</span>'
});

// 父组件
new Vue({
  el: '#app',
  template: '<child message="Hello from parent!"></child>'
});

自定义事件:父组件可以通过 v-on 监听子组件触发的自定义事件,子组件可以通过 $emit 触发自定义事件。

// 子组件
Vue.component('child', {
  template: '<button v-on:click="$emit(\'my-event\')">触发事件</button>'
});

// 父组件
new Vue({
  el: '#app',
  template: '<child v-on:my-event="handleEvent"></child>',
  methods: {
    handleEvent() {
      console.log('事件触发');
    }
  }
});

插槽(Slot):插槽允许你像这样合成组件:

<navigation-link url="/profile">
  个人资料
</navigation-link>

然后你在 <navigation-link> 的模板中可能会写为:

<a v-bind:href="url" class="nav-link">
  <slot></slot>
</a>

Vuex:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

/ 定义状态
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  }
});

// 在组件中使用状态
new Vue({
  el: '#app',
  computed: {
    count() {
      return store.state.count;
    }
  },
  methods: {
    increment() {
      store.commit('increment');
    }
  }
});

生命周期钩子

Vue 实例在创建时都要经过一系列的初始化过程,例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程中也会运行一些叫做生命周期钩子的函数,给予用户在不同阶段添加自己的代码的机会。

常用的生命周期钩子包括:

  • created:在实例创建完成后被立即调用。

  • mounted:实例被挂载后调用。

  • updated:当实例更新完毕之后调用。

  • destroyed:实例销毁后调用。

new Vue({
  data: {
    message: 'Hello, Vue!'
  },
  created() {
    console.log('实例已创建');
  },
  mounted() {
    console.log('实例已挂载');
  },
  updated() {
    console.log('实例已更新');
  },
  destroyed() {
    console.log('实例已销毁');
  }
});

表单处理

v-model 指令可以在表单 <input><textarea> 及 <select> 元素上创建双向数据绑定。

<div id="app">
  <input v-model="message" placeholder="输入消息">
  <p>输入的消息:{{ message }}</p>
</div>
new Vue({
  el: '#app',
  data: {
    message: ''
  }
});

表单验证可以通过自定义指令或插件来实现,例如 VeeValidate。

<div id="app">
  <form>
    <input v-model="email" v-validate="'required|email'" name="email" type="email">
    <span v-show="errors.has('email')">{{ errors.first('email') }}</span>
  </form>
</div>
import VeeValidate from 'vee-validate';

Vue.use(VeeValidate);

new Vue({
  el: '#app',
  data: {
    email: ''
  }
});

API交互

  • 可以使用 Axios 或 Fetch 等库发起 HTTP 请求与后端 API 进行交互。

  • 使用 Axios 发起请求:

    import axios from 'axios';
    
    new Vue({
      methods: {
        async fetchData() {
          try {
            const response = await axios.get('/api/data');
            console.log(response.data);
          } catch (error) {
            console.error(error);
          }
        }
      }
    });
  • 使用 Fetch 发起请求:

    new Vue({
      methods: {
        async fetchData() {
          try {
            const response = await fetch('/api/data');
            const data = await response.json();
            console.log(data);
          } catch (error) {
            console.error(error);
          }
        }
      }
    });

插件与工具

  • Vue Devtools:Vue Devtools 是一个浏览器扩展,用于调试 Vue.js 应用程序。它允许你检查组件层次结构、查看组件的数据和状态等。

  • Vue CLI:Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。它提供了一个功能丰富的命令行工具,可以帮助你快速创建和管理 Vue 项目。

    # 安装 Vue CLI
    npm install -g @vue/cli
    
    # 创建一个新项目
    vue create my-project
    
    # 启动开发服务器
    cd my-project
    npm run serve

性能优化

  • 使用计算属性:计算属性可以缓存计算结果,避免在模板中进行复杂的逻辑运算。

    new Vue({
      data: {
        firstName: 'John',
        lastName: 'Doe'
      },
      computed: {
        fullName() {
          return this.firstName + ' ' + this.lastName;
        }
      }
    });
  • 使用 v-if 和 v-show:v-if 会根据条件销毁或重建元素,而 v-show 只是切换元素的 display 属性。对于频繁切换的元素,使用 v-show 可以提高性能。

    <div v-if="condition">...</div>
    <div v-show="condition">...</div>
  • 使用异步组件:异步组件可以在需要时才加载组件,减少初始加载时间。

    Vue.component('async-component', () => import('./AsyncComponent.vue'));
  • 使用 keep-alive:keep-alive 可以缓存组件实例,避免重复渲染。

    <keep-alive>
      <component :is="currentComponent"></component>
    </keep-alive>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文本高效拆分内容,根据空行高效拆分文本内容,文本文档管理更轻松

文本文档是我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着文本内容的不断增加&#xff0c;如何高效、有序地管理这些文档成为了一个挑战。传统的文本编辑工具往往无法满足我们对于文档整理的需求&#xff0c;而手动整理又费时费力。现在&#xff0c;我们为您带来…

【智能算法】蜉蝣算法(MA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;K Zervoudakis等人受到自然界蜉蝣交配繁殖行为启发&#xff0c;提出了蜉蝣算法&#xff08;Mayfly Algorithm, MA&#xff09;。 2.算法原理 2.1算法思想 MA灵感来自蜉蝣交配…

“天才程序员”拼起命来有多狠?

本周 第四届ATEC科技精英赛&#xff08;ATEC2023&#xff09;线下赛——“燃烧吧&#xff01;天才程序员” 在杭州蚂蚁A空间落幕了 这个比赛同时挑战16名选手脑力和体力的上限 连续三天三夜独立答题&#xff0c;末尾淘汰、组团PK&#xff0c;吃住赛场&#xff0c;每天仅睡4…

超实用的电脑桌面便签+待办清单app

对于上班族来说&#xff0c;桌面便签加待办清单软件是提升工作效率的得力助手。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速记录重要事项&#xff0c;设置待办任务提醒&#xff0c;一切都能有条不紊地进行。这种便捷性&#xff0c;尤其在处理多项任务和紧急事务…

VMware17Pro虚拟机安装macOS教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装补丁4.1 解压补丁4.2 结束VMware相关进程4.3 运行补丁包 5. 安装macOS5.1 新建虚拟机5.2 修改虚拟机配置5.3 安装操作系统5.3.1 选择 ISO 映像文件5.3.2 开启虚拟机5.2.…

Windows上在DLL中嵌入自定义/XML文件

Windows上在DLL中嵌入自定义文件&#xff08;如&#xff1a;xml文件&#xff09; 1、前言 最近都在开发适配Genicam项目&#xff0c;在开发CTI&#xff08;Windows上可以看作DLL&#xff09;时发现需要将多个XML文件嵌入到DLL文件中方便内部代码调用。 2、前期准备 一个xml…

java接口加密解密

这里写目录标题 controller加解密工具类加密&#xff08;本质是对ResponseBody加密&#xff09;解密&#xff08;本质是对RequestBody传参解密&#xff09;注解 controller Controller public class PathVariableController {GetMapping(value "/test")ResponseBod…

【Mysql】mysql本地环境变量的配置

mysql本地环境变量的配置 1.找到Mysql的安装位置 前面步骤完成后安装好MySQL&#xff0c;为MySQL配置环境变量。MySQL默认安装在C:\Program Files下。 2.选择此电脑 右键属性 3.选择 高级系统设置 环境变量 4.配置环境变量 1)新建MYSQL_HOME变量,并配置: C:\Program Fi…

李沐-28 批量归一化【动手学深度学习v2】

记录关于批量归一化的理解&#xff0c;如有出入还请批评指正。 一、批量归一化层主要作用在以下两种情况&#xff1a; 全连接层和卷积层的输出上&#xff0c;同时要在激活函数之前还可以是全连接层和卷积层的输入上 二、关于“批量归一化对于全连接层时&#xff0c;是作用在特…

vue 实现项目进度甘特图

项目需求&#xff1a; 实现以1天、7天、30天为周期&#xff08;周期根据筛选条件选择&#xff09;&#xff0c;展示每个项目不同里程碑任务进度。 项目在Vue-Gantt-chart: 使用Vue做数据控制的Gantt图表基础上进行了改造。 有需要的小伙伴也可以直接引入插件&#xff0c;自己…

基于springboot实现企业级工位管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现企业级工位管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业级工位管理系统的开发全过程。通过分析企业级工位管理系统管理的不足&#xff0c;创建了一个计算机管理企业级工…

【深度学习】YOLOv5,金属表面的缺陷检测,GC10-DET数据集

目录&#xff1a; 文章目录 数据集数据集转换下载yolov5创建 dataset.yaml训练参数开始训练数据分布问询、帮助 数据集 数据集地址&#xff1a; https://github.com/lvxiaoming2019/GC10-DET-Metallic-Surface-Defect-Datasets 数据集下载方式&#xff1a; Download link&…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中&#xff0c;源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据&#xff0c;并且转置列表示i第几个batchbptt 15 #超参数&#xff0c;一次输入多少个ba…

Spring事务回滚核心源码解读

记一次Springboot事务超时不回滚的分析过程 在Springboot中&#xff0c;我用的xml进行事务管理&#xff0c;DataSourceTransactionManager作为事务管理器&#xff0c;配置了事务控制在Service层&#xff1b;在事务管理器中&#xff0c;配置了defaultTimeout事务超时时间为5秒&…

云香印象终端自动化工具(监听农行收款云音箱)

项目成品 支持自动挂单✅完成监控收款云音箱✅完成卷烟盘点✅完成补单✅完成自动入库✅完成监控微信支付✅完成自动提交会员信息✅完成 用到的技术栈&#xff1a;PythonMQTT5.0PHP 云香印象终端自动收款工具 ​​​​​ 当顾客扫了三合一二维码且支付完成时&#xff0c;监控收到…

精酿啤酒:酿造工艺的自动化与智能化发展

随着科技的不断进步&#xff0c;自动化与智能化已成为啤酒酿造工艺的重要发展方向。Fendi Club啤酒紧跟时代潮流&#xff0c;积极推动酿造工艺的自动化与智能化发展&#xff0c;旨在提高生产效率、确保产品品质和满足市场需求。 Fendi Club啤酒引入自动化生产设备。他们采用自动…

Mybatis-plus 字段结果为NULL

问题 Mybatis-plus 字段结果为NULL 详细问题 笔者使用SpringBootMybatis-plus 进行项目开发。进行接口请求测试&#xff0c;在确定SQL语句没有问题的前提下&#xff0c;返回记录部分字段(譬如字段name)为空。 解决方案 修改Mybatis-plus中mapper的xml文件&#xff0c;使re…

CentOS7版本安装mysql

文章目录 1.安装mysql的前置条件2.清理原有的mysql数据库3.查看是否安装mariadb4.安装mysql依赖包5.解压缩mysql包6.安装目录赋权限&#xff08;注&#xff1a;R必须是大写&#xff09;7.创建MySQL组8.将mysql目录的权限授给mysql用户和mysql组9.创建mysql安装初始化配置文件10…

APP广告变现项目

我们提供的服务可以简化为以下几点&#xff1a; 我们将为您开发一款应用程序(APP)&#xff0c;该APP能够连接市场上的主要广告联盟平台。 我们将指导您完成整个“养机”流程&#xff0c;并确保您的单台设备每条广告能产生大约1元的收益。若您拥有10台设备&#xff0c;每日收益…

ElasticSearch搜索引擎中,在Kibana客户端使用命令的时候,千万不要加分号结尾

ElasticSearch搜索引擎中&#xff0c;在Kibana客户端使用命令的时候&#xff0c;千万不要加分号结尾 今天遇到了一个非常难发现的bug 由于经常写java代码&#xff0c;因此常常会在一句代码结尾之处写上一个分号&#xff0c;并且潜意识里觉得这就是非常正常的事情 不会有什么问…