Vue3.0入门级教程/总结/一小时速成 【含代码、文档、资源】
Vue.js+Vue.router
知识总结
- Vue.js+Vue.router
前言:vue.js其实是包含了vue语法、vue-router、vue-cli这几部分的,开发真实前端项目中就是三者一起使用才能做好一个vue项目的;其中vue语法内容比较多,vue-router路由主要用于通信和导航(比如页面的切换),vue-cli用于搭建vue项目(vue-cli的内容比较简单可以参考我的另外一篇笔记 : https://www.bilibili.com/read/cv15231285?spm_id_from=333.999.0.0)
1.1模板语法
插值 : 1文本 2 html (使用v-html指令操作html内容) 3属性** v-bind** 操作html属性 4 v-on监听事件 5** v-if** 条件语句 6** v-for **循环
用户输入:**v-model **实现双向数据绑定
//1div{{...}}
/div//2div111
/divconst new vue(){ data :{ return rewhtml:'这里会显示红色!' }}Vue.createApp(app).mount('#app')//3//参数在指令后用冒号声明.class{color:red,}//4div
//缩写
//动态参数的缩写//修饰符 修饰符是以半角句号 . 指明的特殊后缀,//用于指出一个指令应该以特殊方式绑定。//例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():/div//5//因为 v-if 是一个指令,所以必须将它添加到一个元素上。//如果是多个元素,可以包裹在 元素上,并在上面使用 v-if。最终的渲染结果将不包含 元素。div 你看不到我哈哈
/divconst new vue(){ data :{ return seen:true, }}//6div {{site.text}}
/divconst new vue(){ data :{ return sites:[ //goole,edge,firefox, { text: 'Google' }, { text: 'Runoob' }, { text: 'Taobao' } ] }}//7//v-model 指令用来在 input、select、//textarea、checkbox、radio 等表单控件元素上创建双向数据绑定,//根据表单上的值,自动更新绑定的元素的值。//按钮的事件我们可以使用 v-on 监听事件,并对用户的输入进行响应。div {{message}}
/divconst new vue(){ data :{ return message:"hhhh" }}
1.2、条件语句
1 v-else 2 v-else-if 3 v-show
//1div 你看不到我哈哈
你看到我哈哈
/divconst new vue(){ data :{ return seen:true, }}//2div 你看不到我哈哈
你看到我哈哈
你看到我哈哈
/divconst new vue(){ data :{ return optiona:'hhh' optionb:'heihei' optionc:'ahhh' }}//3//v-show根据条件显示元素div 你看不到我哈哈
/divconst new vue(){ data :{ return seen:true, }}
1.3循环语句
1 v-for 需要以site in sites的形式 2 v-for 可以读取value 3 v-for 可以读取index 4v-for 可以读取key 5 循环整数 6 显示排序结果 7在自定义组件使用v-for
//1div {{site.text}}
/divconst new vue(){ data :{ return sites:[ //goole,edge,firefox, { text: 'Google' }, { text: 'Runoob' }, { text: 'Taobao' } ] }}//2div// {{site.text}}
ul {{value}} /ul/divconst app = { data() { return { object: { name: 'www', url: 'http://www.123.com', slogan: 'hhhhh!' } } }}//3div// {{site.text}}
ul {{key}}:{{value}} /ul/divconst app = { data() { return { object: { name: 'www', url: 'http://www.123.com', slogan: 'hhhhh!' } } }}//4div// {{site.text}}
ul {{index}}.{{key}}:{{value}} /ul/divconst app = { data() { return { object: { name: 'www', url: 'http://www.123.com', slogan: 'hhhhh!' } } }}//6 - {{ n }}
//7//在自定义组件上,你可以像在任何普通元素上一样使用 v-for://然而,任何数据都不会被自动传递到组件里,因为组件有自己独立的作用域。为了把迭代数据传递到组件里,我们要使用 props:
2.1组件component
组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:
每个 Vue 应用都是通过用 createApp 函数创建的,传递给 createApp 的选项用于配置根组件。当我们挂载应用时,该组件被用作渲染的起点。
一个应用需要被挂载到一个 DOM 元素中。
//1全局组件 // 创建一个Vue 应用const app = Vue.createApp({}) // 定义一个名为 runoob 的新全局组件app.component('runoob', { template: '自定义组件!
'}) app.mount('#app')//2 局部组件 var runoobA = { template: '自定义组件!
'} const app = Vue.createApp({ components: { 'runoob-a': runoobA }}) app.mount('#app')//3 prop //子组件与父组件之间的通信 子组件显示父组件传递的数据 {{title}} // 创建一个Vue 应用const app = Vue.createApp({ data() { return { .... } }}) // 定义一个名为 runoob 的新全局组件app.component('sites', { prop:['title'], template: `{{title}}
`}) app.mount('#app')//4 动态绑定父组件数据,当父改变子也改变 //{{title}} v-for="site in sites" :id="site.id" :title="site.title" // 创建一个Vue 应用const Site = { data() { return { sites: [ { id: 1, title: 'Google' }, { id: 2, title: 'Runoob' }, { id: 3, title: 'Taobao' } ] } }}const app = Vue.createApp(Site) // 定义一个名为 runoob 的新全局组件app.component('site-info', { prop:['id','title'], template: `{{id}}-{{title}}
`}) app.mount('#app')//5 prop验证Vue.component('my-component', { props: { // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证) propA: Number, // 多个可能的类型 propB: [String, Number], // 必填的字符串 propC: { type: String, required: true }, // 带有默认值的数字 propD: { type: Number, default: 100 }, // 带有默认值的对象 propE: { type: Object, // 对象或数组默认值必须从一个工厂函数获取 default: function () { return { message: 'hello' } } }, // 自定义验证函数 propF: { validator: function (value) { // 这个值必须匹配下列字符串中的一个 return ['success', 'warning', 'danger'].indexOf(value) !== -1 } } }})
3.1计算属性
1computed 2computed的getter setter
//1 原始字符串: {{ message }}
计算后反转字符串: {{ reversedMessage }}
const app = { data() { return { message: 'RUNOOB!!' } }, computed: { // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } } //computed methods 都可以用来计算,但是methods不需要缓存 methods:{ // 计算属性的 getter reversedMessage: function () { // `this` 指向 vm 实例 return this.message.split('').reverse().join('') } }} Vue.createApp(app).mount('#app')//2var vm = new Vue({ el: '#app', data: { name: 'Google', url: 'http://www.google.com' }, computed: { site: { // getter get: function () { return this.name + ' ' + this.url }, // setter set: function (newValue) { var names = newValue.split(' ') this.name = names[0] this.url = names[names.length - 1] } } }})// 调用 setter, vm.name 和 vm.url 也会被对应更新vm.site = '菜鸟教程 http://www.runoob.com';document.write('name: ' + vm.name);document.write('
');document.write('url: ' + vm.url);
3.2监听属性
1 watch监听事件 2 异步加载watch监听
//1 计数器: {{ counter }}
const app = { data() { return { counter: 1 } }}vm = Vue.createApp(app).mount('#app')vm.$watch('counter', function(nval, oval) { alert('计数器值的变化 :' + oval + ' 变为 ' + nval + '!');});
4.1样式绑定
v-bind:class 缩写为 :class
v-bind:style 缩写为 :style (内嵌样式)
//1.static { width: 100px; height: 100px;}.active { background: green;}.text-danger { background: red;} const app = { data() { return { activeClass: 'active', errorClass: 'text-danger' } }}Vue.createApp(app).mount('#app')//2 菜鸟教程const app = { data() { return { activeColor: 'red', fontSize: 30 } }}Vue.createApp(app).mount('#app')//3 v-bind:style 可以使用数组将多个样式对象应用到一个元素上 菜鸟教程const app = { data() { return { baseStyles: { color: 'green', fontSize: '30px' }, overridingStyles: { 'font-weight': 'bold' } } }}
5.1事件处理
v-on 1 直接绑定到一个方法上 2内联js语法 3事件处理多个方法用逗号分开 4事件符 5按键符
v-on:click 或 @click
@click.once=‘’
-
事件符
-
.stop
- 阻止冒泡 -
.prevent
- 阻止默认事件 -
.capture
- 阻止捕获 -
.self
- 只监听触发该元素的事件 -
.once
- 只触发一次 -
.left
- 左键事件 -
.right
- 右键事件 -
.middle
- 中间滚轮事件
-
-
按键符
全部的按键别名:
-
.enter
-
.tab
-
.delete
(捕获 “删除” 和 “退格” 键) -
.esc
-
.space
-
.up
-
.down
-
.left
-
.right
系统修饰键:
-
.ctrl
-
.alt
-
.shift
-
.meta
鼠标按钮修饰符:
-
.left
-
.right
-
.middle
-
//1 const app = { data() { return { name: 'Runoob' } }, methods: { greet(event) { // `methods` 内部的 `this` 指向当前活动实例 alert('Hello ' + this.name + '!') // `event` 是原生 DOM event if (event) { alert(event.target.tagName) } } }} Vue.createApp(app).mount('#app')//2 const app = { data() { return { name: 'Runoob' } }, methods: { say(message){alert(message) } } }}//3 const app = { data() { return { name: 'Runoob' } }, methods: { greet(event) { // `methods` 内部的 `this` 指向当前活动实例 alert('Hello ' + this.name + '!') // `event` 是原生 DOM event if (event) { alert(event.target.tagName) } } }} Vue.createApp(app).mount('#app')//4......//5 Vue 允许为 v-on 在监听键盘事件时添加按键修饰符Do something
6.1表单
v-model 1v-model在input、text area 2 input在checkbox、radio 3 v-model在select 5值绑定 6修饰符(.lazy .number .trim)
//1 input 元素:
input 表单消息是: {{ message }}
//在textarea中插值不起作用,要用v-model代替 textarea 元素:
textarea 表单消息是:
{{ message2 }}
const app = { data() { return { message: '', message2: '菜鸟教程\r\nhttps://www.runoob.com' } }} Vue.createApp(app).mount('#app')//2 多个复选框做成数组 单个复选框:
多个复选框:
选择的值为: {{ checkedNames }} //3 单选按钮radio
选中值为: {{ picked }} const app = { data() { return { picked : 'Runoob' } }} Vue.createApp(app).mount('#app')//4 选择一个网站 Runoob Google 选择的网站是: {{selected}} //5 ABC
7.1自定义命令
自定义指令 app.directive(‘…’,{…})
页面载入时,input 元素自动获取焦点:
//法一const app = Vue.createApp({})// 注册一个全局自定义指令 `v-focus`app.directive('focus', { // 当被绑定的元素挂载到 DOM 中时…… mounted(el) { // 聚焦元素 el.focus() }})app.mount('#app')//法二const app ={ data(){ return{ } }, directive:{ focus:{ //指令定义 } }}Vue.createApp(app).mount('#app')
-
钩子函数(指令定义函数提供了几个钩子函数)
-
created
: 在绑定元素的属性或事件监听器被应用之前调用。 -
beforeMount
: 指令第一次绑定到元素并且在挂载父组件之前调用。。 -
mounted
: 在绑定元素的父组件被挂载后调用。。 -
beforeUpdate
: 在更新包含组件的 VNode 之前调用。。 -
updated
: 在包含组件的 VNode 及其子组件的 VNode 更新后调用。 -
beforeUnmount
: 当指令与在绑定元素父组件卸载之前时,只调用一次。 -
unmounted
: 当指令与元素解除绑定且父组件已卸载时,只调用一次。
-
import { createApp } from 'vue'const app = createApp({}) // 注册app.directive('my-directive', { // 指令是具有一组生命周期的钩子: // 在绑定元素的 attribute 或事件监听器被应用之前调用 created() {}, // 在绑定元素的父组件挂载之前调用 beforeMount() {}, // 绑定元素的父组件被挂载时调用 mounted() {}, // 在包含组件的 VNode 更新之前调用 beforeUpdate() {}, // 在包含组件的 VNode 及其子组件的 VNode 更新之后调用 updated() {}, // 在绑定元素的父组件卸载之前调用 beforeUnmount() {}, // 卸载绑定元素的父组件时调用 unmounted() {}}) // 注册 (功能指令)app.directive('my-directive', () => { // 这将被作为 `mounted` 和 `updated` 调用}) // getter, 如果已注册,则返回指令定义const myDirective = app.directive('my-directive')app.mount('#app')
钩子函数的参数:el 、binding
el el 指令绑定到的元素。这可用于直接操作 DOM。
binding binding 是一个对象,包含以下属性:
-
instance
:使用指令的组件实例。 -
value
:传递给指令的值。例如,在v-my-directive="1 + 1"
中,该值为2
。 -
oldValue
:先前的值,仅在beforeUpdate
和updated
中可用。值是否已更改都可用。 -
arg
:参数传递给指令 (如果有)。例如在v-my-directive:foo
中,arg 为"foo"
。 -
modifiers
:包含修饰符 (如果有) 的对象。例如在v-my-directive.foo.bar
中,修饰符对象为{foo: true,bar: true}
。 -
dir
:一个对象,在注册指令时作为参数传递。
8.1路由
是一个组件,该组件用于设置一个导航链接,切换不同 HTML 内容。 to 属性为目标地址, 即要显示的内容。
将显示与 url 对应的组件。你可以把它放在任何地方,以适应你的布局
****属性:to 、event、replace 、apprend tag
Hello App!
<!--`` 将呈现一个带有正确 `href` 属性的 `` 标签--> Go to Home Go to About
//1. 定义路由组件.// 也可以从其他文件导入const Home = { template: 'Home' }const About = { template: 'About' } // 2. 定义一些路由// 每个路由都需要映射到一个组件。// 我们后面再讨论嵌套路由。const routes = [ { path: '/', component: Home }, { path: '/about', component: About },] // 3. 创建路由实例并传递 `routes` 配置// 你可以在这里输入更多的配置,但我们在这里// 暂时保持简单const router = VueRouter.createRouter({ // 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。 history: VueRouter.createWebHashHistory(), routes, // `routes: routes` 的缩写}) // 5. 创建并挂载根实例const app = Vue.createApp({})//确保 _use_ 路由实例使//整个应用支持路由。app.use(router) app.mount('#app') // 现在,应用已经启动了!
9.1mixins
混入 (mixins)定义了一部分可复用的方法或者计算属性。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。
// 定义混入对象const myMixin = { created() { this.hello() }, methods: { hello() { console.log('欢迎来到混入实例-RUNOOB!') } }} // 定义一个应用,使用混入const app = Vue.createApp({ mixins: [myMixin]}) app.mount('#app') // => "欢迎来到混入实例-RUNOOB!"//2选项合并const myMixin = { data() { return { message: 'hello', foo: 'runoob' } }} const app = Vue.createApp({ mixins: [myMixin], data() { return { message: 'goodbye', bar: 'def' } }, created() { document.write(JSON.stringify(this.$data)) }})
10.1axios
https://www.runoob.com/vue3/vue3-ajax-axios.html
vue-resouce在2.0版本使用较多,用来做为异步加载请求数据的技术
$.ajax( url:'', funtion(data){ //获取数据后进行的事件 }})axios({ method:'get', url:'', }).then(res=>{ .....})
希望以上内容对你有所帮助,有任何问题可以联系作者,想要资源文档可以联系作者。