发布时间:2024-09-21 15:01
是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
$ npm install vue
//这里用cdn的地址引入vue
{{ message }} {{name}} //引用message和name变量,这个{{}}是插值表达式
针对上述的简单例子,我们不禁会有几个关于挂载点的小问题?
1. Vue实例的作用范围是哪个呢?
答:Vue会管理el选项命中的元素及其内部元素
2. 是否可以使用其他选择器?
答:可以使用其他选择器,但是建议使用id选择器
3. 是否可以设置其他的Dom元素呢?
答:可以使用其他的双标签,但是记住,不能挂载到html和body标签上,会报错
Vue中用到的数据定义在data中,data可以写复杂类型的数据,渲染复杂类型的数据时 ,只要符合js预发即可
1、v-text的作用是:设置标签的文本内容(textContent)
2、默认写发会替换掉全部的文本内容,如果想要实现局部替换,则使用插值表达式的形式{{}}
3、例子://data中的message属性值会插入到div中作为其文本内容
1、用法和v-text相似,作用是:设置元素的innerHTML
2、区别就是v-text只会解析文本内容,然后插入到对应元素内部,但v-html如果引用的值是一个html标签结构的,v-html就会将其解析成html,然后插入到对应元素内部
v-on是为元素绑定事件的,它有一种简写方式@(v-on:===@),事件写在与el、data同级的methods对象中
这里还要提到一个事件修饰符(.修饰符),事件后面跟上.修饰符可以对事件进行限制,举个例子,@.entry=“xxx”,这样写只有按entry键才能触发xxx函数
它是用来控制元素的显示状态,它的本质是修改元素的display,实现显示隐藏,指令后面的内容最终都会解析为布尔值
它也是用来控制元素的显示状态,它的本质是通过操纵dom元素来切换显示状态,表达式为true时,元素存在于dom树中,false时从dom树中移除
作用:为元素绑定属性,完整写法v-bind:属性名,简写:直接省略v-bind,直接:属性名
注意:它只能实现数据的单向绑定,只能从M(model)->V(vi)
作用:根据数据生成列表结构,数组经常和v-for一起使用,预发是(item,index)in 数组数据,item和index可以结合其他指令一同使用
该指令可以实现表单元素和Model中数据的双向绑定,但是要注意,它只能用在表单元素中(input、select、checckbox、textarea这些)
Demo:inout中输入改变,也会同步影响data中的值,值改变了也会同步影响第一行引用message的显示
vue中允许你自定义过滤器,用于一些常见文本的格式化,它只能用于两个地方插值表达式({{}})和v-bind表达式中,一般分为两种(私有和全局)
定义方式:
Vue.filter(\'过滤器名称\',function(data){ //直接用Vue来定义filter,所有的实例对象都能用
return \"新的处理后的内容\"
})
调用方式:
{{ name | 过滤器名称 }} //这段代码的意思就是说,原先引用的是name变量的值,他会经过过滤器的处理,返回的新的结果作为此处的最终结果
注意:调用过滤器的时候还可以给过滤器传参,放到过滤器定义时的函数的第二个形参位置,因为第一个默认是过滤器 | 符号前的变量值
定义方式:
const vm2 =new Vue({
el:\"#app\",
data:{...}
methods:{...}
filters:{
过滤器名称:function(){
....
}
}
})
调用方式: 同上。。。
定义方式:
Vue.directive(\'自定义指令名称\',{
bind:function(el){...} // 每当指令绑定到元素上时会立即执行该函数,只执行一次,但此时还没插入到DOM树中
inserted:function(el){...} //元素插入到DOM中时执行,只执行一次
update:function(el){...} //所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
componentUpdated:function(){...} //指令所在组件的 VNode 及其子 VNode 全部更新后调用。
unbind:function(){...} //只调用一次,指令与元素解绑时调用。
})
//每个函数中的第一个参数永远是el,表示被绑定了指令的那个元素
使用方式:
在你绑定的元素上用v-加上你自定义的指令名称:
定义方式:
directives: { //也是和上述定义私有过滤器一样写在实例的directives属性中
focus: {
bind:function(el){...}
inserted:function(el){...}
update:function(el){...}
}
}
指令钩子函数会被传入以下参数:
el:指令所绑定的元素,可以用来直接操作 DOM。
binding:一个对象,包含以下 property:
除了 el 之外,其它参数都应该是只读的,切勿进行修改。如果需要在钩子之间共享数据,建议通过元素的 dataset 来进行。
在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如这样写:
Vue.directive(\'color-swatch\', function (el, binding) { //直接在定义指令后跟函数,而不是上面的对象
el.style.backgroundColor = binding.value
})
//transition标签是vue官方提供的,将要动画的元素包裹住
你好
//给transition标签添加一个name属性来自定义动画类名前缀
你好
vue中的组件的出现是为了拆分Vue实例的代码量的,能够让我们以不同的组件来划分不同的功能
//直接用标签的形式使用自定义组件
注意:如果在定义组件的时候,写的自定义组件名称是驼峰形式的,如上面那样,那么你在调用组件时要小写并以-连接,如果没有驼峰形式的,直接原样调用即可
//直接在组将注册方法中,第二个参数中传入一个对象,template属性还是一样定义组件的html结构
Vue.component(\'myCom1\',{
template:\"12312312312321
\"
})
缺点:html结构如果有嵌套,这样写成字符串形式太麻烦了,不便于开发书写
//直接用标签的形式使用自定义组件
//直接在控制元素外面定义个模板,这样便于开发者书写,有提示
1111
2222
Vue.component(\'myCom1\',{
template:\"#temp\" //template原先的手写字符串替换成外面定义的模板元素,id要一致
})
//定义组件模板接口
1111
var app = new Vue({
el: \'#app\',
data: {
flag : false
},
components:{ //私有组件还是在实例对象中添加components属性
组件名称:{
template:\"#temp\"
}
}
});
{{name}}
//调用组件自身的data数据,调用方式和实例的data一样
注意:props中的数据是只读的,而组件自身内部的data是可读可写的
//通过事件绑定方式去传递父组件的show方法,简写 @focus
点我 //子组件点击时调用自身的方法myClick
点我 //子组件点击时调用自身的方法myClick
直接在想要获取的dom元素和组件上写上ref属性,获取通过this.$refs就能获取,这样就不用操作dom就你能获取对应元素了
1、直接下载 / CDN
https://unpkg.com/vue-router/dist/vue-router.js
Unpkg.com 提供了基于 NPM 的 CDN 链接。上面的链接会一直指向在 NPM 发布的最新版本。你也可以像 https://unpkg.com/vue-router@2.0.0/dist/vue-router.js 这样指定 版本号 或者 Tag。
在 Vue 后面加载 vue-router,它会自动安装的:
2、NPM下载安装
npm install vue-router
如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:
import Vue from \'vue\'
import VueRouter from \'vue-router\'
Vue.use(VueRouter)
1、导入包文件
2、定义不同组件
const login ={
template:\"我是登录组件
\"
}
const register={
template:\"我是注册组件
\"
}
3、创建路由对象,当导入vue-router包文件后,在全局window对象中就会有一个路由构造函数,叫做VueRouter,在new的时候可以给构造函数传递一个配置对象
const routerObj =new VueRouter({
routes:[ //路由规则
{path:\'/login\',component:login},
{path:\'/register\',component:register}
]
})
4、关联实例,注册路由对象
const vm =new Vue({
el:\"#app\",
data:{},
methods:{},
router:routerObj //将路由对象注册到实力上,用来监听url地址,然后展示对应的组件
})
5、在视图层(实例关联的元素上占位,用于显示路由匹配的组件)
//这是vue-router提供的标签,专门用来占位的,将来路由匹配到的组件就会放到这里显示
以前用自己写的a标签超链接实现路由跳转
跳转登录组件
跳转注册组件
vue-router有提供一个router-link标签,默认渲染为a标签
跳转登录组件
跳转注册组件
// 通常用于初始的根目录的重定向
routes:[
{path:\'/\',redirect: \"/login\"}
{path:\'/login\',component:login},
{path:\'/register\',component:register}
]
1、使用query(查询字符串)方式传递参数
跳转登录组件
注意:这种方式传递参数不需要修改路由匹配规则,如果你要拿到传递的参数,可以在组件内部通过this.$route.query组件实例上获取
2、使用params方式传递参数
跳转登录组件 //这边直接按匹配规则来传参
routes:[
{path:\'/login/:id\',component:login}, //这边路由匹配规则中通过占位符来匹配对应路由参数
]
注意:如果想要得到传递的id:123,可以通过this.$route.param获取
//如果想要再login登录组件中又生成一个二级路由/login/account1和/login/account2
const router= new UseRouter({
routes:[
{
path:\'/login\',
component:login,
children:[ //需要在一级路由的children属性中定义路由规则
{ path:\'account1\',component:account1 },
{ path:\'account2\',component:account2 }
]
}
{ path:\'/register\',component:register}
]
})
//视图区还是设置3个坑来显示,但是使用name属性说明这个坑就只显示对应name的组件
const header = {
template:\"我是header组件
\"
}
const leftCom= {
template:\"我是左侧侧边栏组件
\"
}
const rightCom= {
template:\"我是主体区组件
\"
}
const router =new VueRouter({
routes:[
{path:\"/\",components:{ //这里的路由规则中匹配到/时可以同时显示多个组件,每个组件有key,要和视图区的坑的name对应
\"default\":header,
\"leftCom\":leftCom,
\"rightCom\":rightCom
}}
]
})
//布局的样式文件忽略。。。。。
1、使用watch来监听data中变量的变化
//通过点击事件来改变data中的flag变量值,用watch来监听flag的值
{{flag}}
2、watch监听路由地址的变化
watch:{
‘$route.path’:function(){ //直接监听$route
console.log(\'路由发生改变了\')
}
}
在computed中可以定义一些属性,这些属性叫做【计算属性】,计算属性的本质其实是一个方法,只不过我们在使用这些计算属性的时候,是把他们的名称直接当成属性来使用,而不是当做方法去调用
注意:
1、计算属性 在引用的时候一定不要加()去调用,直接把他当成普通的属性(变量)去使用
2、只要 这个计算属性内部有用到data中的数据,而且这些data数据发生了改变,就会触发该计算属性(该方法),也就是会立即重新计算这个计算属性的值
3、计算属性的值会被缓存起来,方便下次直接使用
4、在计算属性的函数中一定要return 值
const login ={
template:\"我是登录组件
\"
}
const vm =new Vue({
data:{},
methods:{},
render:function(createElements){ //createElement是一个方法,调用它,会把指定的组件模板渲染为html结构
return createElements(login)
}
})
注意:这种render方式渲染组件,这个return 返回的组件内容会替换掉上面el挂载的那个元素(整个替换),不想以前那种通过component形式渲染组件,那个只是在对应位置放了一个组件而已,不影响div中其他存在的元素
1、回顾下,页面中是如何导入Vue的?
//直接通过script标签导入
2、webpack中导入Vue
//先通过npm下载Vue包
npm i vue --save
//然后通过import导入,但是这样的方式导入需要注意,这样导入的vue的构造函数功能并不齐全,只提供了runtime-only的方式,所以如果想要直接import导入,可以通过相对路径去导入对应的完整vue包文件
import Vue from vue //x
import Vue from \"../node_modules/vue/dist/vue.js\" //√,引入完整功能的vue.js文件
如果我就想直接通过import直接引入怎么办?
import Vue from \"vue\" //引入方式不变
但需要在webpack.config.js配置文件中去修改vue包文件的路径,增加resolve属性,vue$的意思是:当遇到vue结尾的文件导入时,去右侧的指定路径去找
1、先单独定义login.vue组件文件
login组件
2、页面中导入
import login from \'./login.vue\'
3、由于webpack默认解析不了vue文件格式,所以需要再下载对应的loader
npm i vue-loader vue-template-compiler -S
4、然后再Vue实例中通过render属性渲染组件(webpack中不能用components的方式渲染组件)