vue

Vue

Vue介绍

vue分别为两个版本,开发版本development和生产版本production

开发版本:vue.js里有主食,有空格有换行等,并且有提示,尤其是错位提示

开发版本:vue.js被压缩成了一行,所以不必要的注释/空格/换行等,都被删除,而且删除了所有的提示,目的是为里减小项目的体积,是打开页面更快,项目上线时用

使用Vue

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <!--   1.引入Vue-->
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
   <!--2.新建#App-->
<div id="app">
   <!--   6.双大括号展示数据-->
   <button @click="count++">Count is:{{count}}</button>
</div>
   <script>
/*       Vue={
          createApp:function (ojb) {

          }
      }*/
// 3.导入createApp
const {createApp} = Vue  //ES6对象的解构赋值
createApp({
   data() { //ES6对象的解构赋值(函数) 看不懂回去看ES6笔记
       return {
           count: 0 //4.创建数据
      }
  }
}).mount('#app') //5.挂载到#App上

/*       Vue.createApp({
          data:function () {
              return{
                  count:0
              }
          }
      }).mount('#app')*/
   </script>
</body>
</html>

 

文本插值

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
   <p>{{msg}}</p>
   <!--   最基本的数据绑定形式是文本插值,它使用的是“Mustache”语法 (即双大括号)-->
</div>
<script>

   const {createApp} = Vue
   createApp({
       data() {
           return {
               msg: 'Hello World!'
          }
      }
  }).mount('#app')
</script>
</body>
</html>

js中的数据,展示在界面上,相当于原生js中的innnerText方法

 

原始HTML

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
   <p>我会{{msg}}了</p>
   <p>我会<span v-html="msg"></span>了</p>
</div>
<script>

   const {createApp} = Vue
   createApp({
       data() {
           return {
               msg: '<strong>Vue</strong>'
          }
      }
  }).mount('#app')
</script>
</body>
</html>

本指令相当于原始jsHTML

 

Attribute 绑定

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
   <p v-bind:id="idName">我会了</p>
   <img v-bind:src="imgUrl" alt="">
   <img :src="imgUrl" alt="">
</div>
<script>

   const {createApp} = Vue
   createApp({
       data() {
           return {
               idName:'txt',
               imgUrL:'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic1.win4000.com%2Fwallpaper%2F2020-10-14%2F5f86b08606c7e.jpg&refer=http%3A%2F%2Fpic1.win4000.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665193913&t=daebad3d83345091b51270fce16522e8'
          }
      }
  }).mount('#app')
</script>
</body>
</html>

v-bind来修改标签的 属性,简写用即可

布尔型 Attribute

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
   <audio src="" :controls="ctl"></audio>
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               ctl: false //true
          }
      }
  }).mount('#app')
</script>
</body>
</html>

同时绑定多个Attribute

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="https://unpkg.com/vue@3"></script>
</head>
<body>
<div id="app">
   <div v-bind="obj">65564</div>
   <div :="obj">简写成:也可以</div>
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               obj:{
                   id:'textId',
                   classNmae:'textClass', //注意:class名在js中要写成className,这里用class或className都可以
                   title:'我是title'
              }
          }
      }
  }).mount('#app')
</script>
</body>
</html>

 

使用 JavaScript 表达式

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
   <p>number:{{num+1}}</p>
   <p>小明本次考试{{scoreNum<60?"不及格":"及格"}}</p>
   <!--   这里必须是表达式-->
  <p :id="`list-${id}`">{{message.split('').reverse().join('')}}</p> <!-- 字符串反转(先拆分split;在反转reverse;在合并字符串)-->
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               num:0,
               scoreNum:60,
               message:'Hello World!',
               id:1
          }
      }
  }).mount('#app')
</script>
</body>
</html>

 

注意:每个绑定仅支持单一表达式,也就是一段能够被求值的JavaScript代码(语句不可以)。

 

调用函数

可以在绑定的表达式里调用函数,但是非常不建议这么做,可以使用Math或Date等全局暴露的函数

<div>
   <p>生成一个随机数{{Math.random()}}</p>
</div>

 

computed计算属性

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
   <p>{{reverseStr}}</p>

   <ul>
       <li>{{text.split('').reverse().join()}}</li>
       <li>{{text.split('').reverse().join()}}</li>
       <!--上面两行,同样的功能要计算两次,消耗性能,并且导致HTML代码臃肿,下面用计算属性更优-->
       <li>{{reverseStr}}</li>
       <li>{{reverseStr}}</li>
       <li>{{reverseStr}}</li>
   </ul>
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               text: 'Hello World!'
          }
      },
       computed: {
           reverseStr() { //这里一定要指定this.text,this指的是当前实例,可以理解为date里的数据
               return this.text.split('').reverse().join()
          }
      }
  }).mount('#app')
</script>
</body>
</html>

 

事件处理

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
   <p>{{count}}</p>
   <button v-on:click="increment()">+</button>
   <button @click="increment()">+</button>

   <button v-on:click="decrement()">-</button>
   <button @click="decrement()">-</button>

   <button @click="increment(5)">+5</button>
   <button @click="increment(6)">+6</button>

   <button @click="decrement(5)">-5</button>
   <button @click="decrement(6)">-6</button>
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               count:0
          }
      },
       computed:{  //计算属性

      },
       methods:{  //方法
           increment (a=1) {
               // this.count++
               this.count+=a
          },
           decrement(a=1){
               // this.count--
               this.count-=a
          }
      }
  }).mount('#app')
</script>
</body>
</html>

计算属性VS方法

注意:计算属性和方法,在结果上确实是相同的,然而在不同之处在于计算属性会基于其响应式依赖的被缓存。一个计算属性仅会在其响应式依赖更新时才会被重新计算。

条件渲染

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <ul>
        <li v-if="type==='A'">AAAA</li>
        <li v-else-if="type==='B'">BBBB</li>
        <li v-else>CCCC</li>
    </ul>
    <p v-show="seen">现在你看的到我</p>

</div>
<script>
    const {createApp} = Vue
    createApp({
        data() {
            return {
                type:'B',
                seen:false
            }
        }
    }).mount('#app')
</script>
</body>
</html>

 

列表渲染

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
   <table>
       <thead>
       <tr>
           <th>id</th>
           <th>书名</th>
           <th>价格</th>
       </tr>
       </thead>
       <tbody>
       <tr v-for="(book,index) of books" :key="index">
<!--           key一般是数据库里的数据上唯一且不重复的主键--即id-->
           <td>{{book.id}}</td>
           <td>{{book.name}}</td>
           <td>{{book.price}}</td>
       </tr>
       </tbody>
   </table>
</div>
<script>
   const {createApp} = Vue
   createApp({
       data() {
           return {
               books:[
                  {id:0,name:'三体',price:68},
                  {id:1,name:'平凡的世界',price:89},
                  {id:2,name:'三国演义',price:48},
              ]
          }
      }
  }).mount('#app')
</script>
</body>
</html>

 

表单输入绑定

 

基本用法1

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
<!--    <input type="text" :value="text" @input="ipt($event)">-->
    <input type="text" v-model="text">
    <p>{{text}}</p>
</div>
<script>
    const {createApp} = Vue
    createApp({
        data() {
            return {
               text:'Hello World!'
            }
        }
    }).mount('#app')
</script>
</body>
</html>

多行文本

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<title></title>
</head>
<body>
<div id="app">
<p style="white-space: pre-line">{{message}}</p>
  此css属性可以展示字符串中的换行符,可以被
<textarea v-model="message"></textarea>
  多行文本,及换行符,可以被v-model实时修改数据
</div>

<script>
const {createApp}=Vue
createApp({
data() {
return {
message:''
}
}
}).mount('#app')
</script>
</body>
</html>

 

复选框

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<title></title>
</head>
<body>
<div id="app">
<label for="ipt"></label>
<input type="checkbox" id="ipt" checked="checked">数据单向绑定,data驱动UI,UI不可以修改data
<p>{{checked}}</p>
</div>

<script>
const {createApp}=Vue
createApp({
data() {
return {
checked:true
}
}
}).mount('#app')
</script>
</body>
</html>

 

数据的双向绑定

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <script src="node_modules/vue/dist/vue.global.js"> </script>
	<title></title>
</head>
<body>
<div id="app">
	<label for="ipt"></label>
	<input type="checkbox" id="ipt" v-model="checked">数据单向绑定,data驱动UI,UI不可以修改data
	<p>{{checked}}</p>
</div>

<script>
	const {createApp}=Vue
	createApp({
		data() {
			return {
				checked:true
			}
		}
	}).mount('#app')
</script>
</body>
</html>

 

将多个复选框绑定到同一个数组或集合

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <script src="node_modules/vue/dist/vue.global.js"> </script>
	<title></title>
</head>
<body>
<div id="app">
	<h2>选中的人是:{{checkedNames}}</h2>
	<input type="checkbox" v-model="checkedNames" value="Jack">Jack
	<input type="checkbox" v-model="checkedNames" value="Jom">Jom
	<input type="checkbox" v-model="checkedNames" value="Mike">Mike
</div>

<script>
	const {createApp}=Vue
	createApp({
		data() {
			return {
				checkedNames:[]
			}
		}
	}).mount('#app')
</script>
</body>
</html>

 

单选框

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<title></title>
</head>
<body>
<div id="app">
<h2>选中的人是:{{picked}}</h2>
<input type="radio" v-model="picked" value="1">男
<input type="radio" v-model="picked" value="0">女
</div>

<script>
const {createApp}=Vue
createApp({
data() {
return {
picked:1
}
}
}).mount('#app')
</script>
</body>
</html>

选择器

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <script src="node_modules/vue/dist/vue.global.js"> </script>
	<title></title>
</head>
<body>
<div id="app">
	<div>Selected: {{ selected }}</div>

	<select v-model="selected">
		<option disabled value="">Please select one</option>
		<option>A</option>
		<option>B</option>
		<option>C</option>
	</select>
</div>

<script>
	const {createApp}=Vue
	createApp({
		data() {
			return {
				selected:''
			}
		}
	}).mount('#app')
</script>
</body>
</html>

注意

如果 v-model 表达式的初始值不匹配任何一个选择项,<select> 元素会渲染成一个“未选择”的状态。在 iOS 上,这将导致用户无法选择第一项,因为 iOS 在这种情况下不会触发一个 change 事件。因此,我们建议提供一个空值的禁用选项,如上面的例子所示。

 

多选

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<title></title>
</head>
<body>
<div id="app">
<div>Selected: {{ selected }}</div>

<select v-model="selected" multiple>
      这个属性的作用multiple
<!-- <option disabled value="">Please select one</option>-->
<option>AAAAA</option>
<option>BBBBB</option>
<option>CCCCC</option>
</select>
</div>

<script>
const {createApp}=Vue
createApp({
data() {
return {
selected:[]
}
}
}).mount('#app')
</script>
</body>

 

修饰符

 

.lazy`

默认情况下,v-model 会在每次 input 事件后更新数据 你可以添加 lazy 修饰符来改为在每次 change 事件后更新数据:

<!-- 在 "change" 事件后同步更新而不是 "input" -->
<input v-model.lazy="msg" />

.number`

如果你想让用户输入自动转换为数字,你可以在 v-model 后添加 .number 修饰符来管理输入:

<input v-model.number="age" />

如果该值无法被 parseFloat() 处理,那么将返回原始值。

number 修饰符会在输入框有 type="number" 时自动启用。

.trim`

如果你想要默认自动去除用户输入内容中两端的空格,你可以在 v-model 后添加 .trim 修饰符:

<input v-model.trim="msg" />

类与样式绑定

 

绑定对象

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<style>
@keyframes zhuan {
0%{transform: rotate(0)}
100%{transform: rotate(360deg)}
}
.active{animation: zhuan 10s linear infinite}
</style>
<title></title>
</head>
<body>
<div id="app">
<div :class="{active: isActive}">
mdawmdiw
</div>

</div>
<script>
const {createApp}=Vue
createApp({
data() {
return {
isActive:true
}
}
}).mount('#app')
</script>
</body>
</html>

 

生命周期

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<style>
@keyframes zhuan {
0%{transform: rotate(0)}
100%{transform: rotate(360deg)}
}
.active{animation: zhuan 10s linear infinite}
</style>
<title></title>
</head>
<body>
<div id="app">
{{message}}
</div>
<script>
const {createApp}=Vue
createApp({
data() {
return {message:111}
},
setup(){
console.log('setup')
},
beforeCreate() {
console.log('beforeCreate')
},
created(){
console.log('created')
},
beforeMount(){
console.log(beforeMount)
},
}).mount('#app')
</script>
</body>
</html>

 

侦听器

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>Title</title>
   <script src="../..ue-shopping-cartde_modulesue/distue.global.js"></script>
</head>
<body>
<div id="app">
   <p>{{message}}</p>
   <input type="text" v-model="message"><p>{{name}}</p>
</div>
</body>
<ml>
<script>
   const {createApp}=Vue
   const vm=createApp({
       data(){
           return{
               message:'1111',
               name:'xxxx'
          }
      },
       watch:{
           message(){//要监听哪个数据,就对应哪个
               //console.log('message changed')
               if(this.message.length>=10)alert('long')
          }
      }
  }).mount('#app')
</script>

 

vue中的Dom

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Title</title>
   <script src="node_modules/vue/dist/vue.global.js"> </script>
<style>
#test{
width: 100px;
height: 100px;
background: aquamarine;
}
</style>

</head>
<body>
<div id="app">
<div id="test" ref="test"></div>
<button @click="big">变大div</button>
<input type="text" ref="ipt">
</div>
<script>
const {createApp}=Vue
const vm= createApp({
data() {
return {

}
},
methods:{
big() {
console.log(this.$refs)
this.$refs.test.style.width='200px'
},
setup(){
console.log(this.$refs)},
beforeCreate() {
console.log(this.$refs)
},
created(){
console.log(this.$refs)
},
beforeMount(){
console.log(this.$refs)
},
mounted(){
this.$refs,ipt.focus()
}
}
}).mount('#app')
</script>
</body>
</html>

 

vue脚手架

vue-cli

安装

#首先确保已安装node
node -V
npm -v
#其次确保npm镜像地址是国内的淘宝镜像(有梯子除外)
npm config get registry
#如果路径是这个的话,则说明是淘宝镜像,否则需要改成淘宝镜像,命令如下:
npm config set registry http://registry.npmmirror.com/

#再次安装vue-cli,命令如下:
npm i -g @vue/cli
#查看vue-cli安装版本
vue -V

基于vue-cli创建vue3.0项目

vue create hello-world #必须小写名文字母
Manally select features #手动选择分支
Babel #仅选择babel (上下键切换,空格选择/取消,回车确认)
choose a version for Vue?  #3.x
where do you? #In dedicated config files 保存到另外文件中即不保存到package.json(package.json内容够多了)
Save this as s preset #No 不保存为分支

Loading。。。。。。


cd hello-world
npm run serve

#复制网址到浏览器打开网址即可

基于vue-cli vueUI创建项目

非常不建议使用,丢人现眼!

基于vite创建Vue项目

基于viet,不需要安装,只要有node和npm即可,但是node版本要在15.0

$ npm init vue

项目目录

vue-project 
--.vscode             配置vscode,没用
--node_modules
--public
--src                 关键,程序员写的代码都在这里
--assets               项目所需的静态文件
--components           组件文件夹
--App.vue             根组件
--main.js             主要的js
--.gitignore           git上传时,不要的文件配置
--index.html           页面包含一个#app
--package.json
--package-lock.json
--README.md
--vite.config.js       vite配置文件

 

组件

组件是vue这种框架的基石,是最重要的部分。

新建组件

在vite创建的项目中创建组件:

在components文件下,右键新建.vue文件,就是一个组件

<template>
   <p>
    这里面写标签
      外层的template仅做辅助编译,将来生成的html界面中,不存在template标签
   </p>
<div>
      再过去,vue2中,在这里的根标签必须仅能有一个(即template的亲儿子只能有一个),vue3不做限制
   </div>
</template>

<script >
   //这里面写js
   export default{ //对外暴露,ES模块化的语法,等同于node中commonJs中的moudule.exports
       name:'HelloWorld'
       data(){
           return{
               message:''
          }
      }
  }
</script>

<style scoped>
/*
  这里面写css
  这里的scoped的,通过被被选中的标签生成独一无二的随机属性名来让当前的css仅在本组件中生效
   
  */
</style>

 

引入组件

在父组件中引入

<template>
   
</template>

<script>
  import HelloWorld form './components/HelleWorld.vue'
   //编译器可能会把.vue省略掉,viet中一定要加上
   //如果在vue-cli里面,可以不加.vue后缀
   export default{
       name:'Header-1'
  }
</script>

<style scoped>

</style>

 

注册组件

注册组件分两种,分别是注册局部组件和注册全局组件

注册局部组件(常用)

<template>
   
</template>

<script>
  import HelloWorld form './components/HelleWorld.vue'
   //编译器可能会把.vue省略掉,viet中一定要加上
   //如果在vue-cli里面,可以不加.vue后缀
   export default{
       name:'Header-1',
       components:{
           //HelloWorld:HelloWorld
           HelloWorld
      }//注册组件
  }
</script>

<style scoped>

</style>

 

注册全局组件

main.js

import { createApp } from 'vue'
import App from './App.vue'

// import './assets/main.css'

import Header1 from './components/Header-1.vue' //引入


createApp(App)
  .component('Header1',Header1)//注册全局注册
  .mount('#app')

 

使用组件

父组件

<template>
<HelloWorld></HelloWorld>
   <HelloWorld/>
<helloWorld></helloWorld>
   <helloWorld>
</template>

注意:在组件中没有内容时,才可以改写成单标签

 

 

 

posted @ 2022-09-14 11:35  ljq6666  阅读(93)  评论(0)    收藏  举报