一个vue组件主要包括3个部分:界面展示代码template、业务实现代码script、界面布局代码style
<template>
<div class="class_1">
<h2>{{msg}}</h2>
这是一个fry VueComponentTest
</div>
</template>
<script>
export default {
name: 'FryTest',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
}
}
</script>
<style scoped>
.class_1{
color: red;
}
</style>
vue中的el属性
类型:string | Element
限制:只在用 new 创建实例时生效。
详细:
提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。可以是 CSS 选择器,也可以是一个 HTMLElement 实例。
在实例挂载之后,元素可以用 vm.$el 访问。
如果在实例化时存在这个选项,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译。
提供的元素只能作为挂载点。不同于 Vue 1.x,所有的挂载元素会被 Vue 生成的 DOM 替换。因此不推荐挂载 root 实例到 或者 上。
如果 render 函数和 template property 都不存在,挂载 DOM 元素的 HTML 会被提取出来用作模板,此时,必须使用 Runtime + Compiler 构建的 Vue 库。
简单来说el的作用就是表明我们要将当前vue组件生成的实例插入到页面的哪个元素中,el属性的值可以是css选择器的字符串,或者直接就是对应的元素对象。并且只能在使用new生成实例时才能配置el属性,而我们在组件中只是export一个配置对象,如果设置了el则会报错。
// 错误使用方式,在组件中设置el
// 提示错误: [Vue warn]: option "el" can only be used during instance creation with the `new` keyword.
export default {
el: '#app'
}
// 正确写法
var vm = new Vue({
el: '#app'
})
我们再看看项目中的index.html。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>backstage</title>
</head>
<body>
<!-- {el:'#app'} 即把这里的元素作为根实例的挂载对象 -->
<div id="app"></div>
</body>
</html>
打印vm.$el,会发现实例已经被挂载到el对于的元素中:
Vue中props的用法
props的注意事项
作用:props是用于Vue中父组件
向子组件
传值的时候使用。
- props的传递是单向的。
- 不要在子组件改变props的值。
1、props是单项传递
父组件值的会改变子组件的值,子组件的值改变不会影响父组件,如下:
//语法说明
<div id="app">
<input type="text" v-model='value'/>
父组件的值:{{ value }}
<my-component :value='value'></my-component>
</div>
//这里注册了一个全局组件
Vue.component('my-component',{
props:['value'],
template:`<div>
子组件的值:{{ value }}
<button @click='clickMe'>修改子组件的值</button>
</div>`,
methods:{
clickMe(){
this.value = 123;
}
}
})
//初始化Vue对象
var vm = new Vue({
el: '#app',
data:{
value:'请输入内容'
}
})
-
可以看到在输入框我们输入的值,同时子组件的值也改变了。
- 在我们点击按钮修改props的值时,子组件的值被修改,但父组件的值没有修改,并且控制台报错,要求我们不要尝试修改props的值。
2、不要在子组件改变props的值。
上个例子也看到,直接在子组件改变props的值Vue会报错。因为Vue推荐props适用于两种情况。
- 总是根据父组件的值进行变化。
- 作为子组件data属性的初始值。
// 接收父组件的Value值,并将props的值赋予子组件的childValue当初始值。
// 通过改变childValue来实现效果
Vue.component('my-component',{
props:['value'],
template:`<div>子组件的值:{{ childValue }}<br/><button @click='clickMe'>修改子组件的值</button></div>`,
data(){
return{
childValue: this.value
}
},
methods:{
clickMe(){
this.childValue = 123;
}
}
})
3.注意
值得注意的是,当我在想通过输入框来改变props的值,childValue的值并没有跟着修改,符合初始值的定义。推测,可能
childvalue:this.value
采用的是值传递。
组件中的script标签中如何写vue中的methods、watch、各种生命周期函数等
直接写export default 里
<script>
export default {
name: "App",
data() {//数据定义 函数方法,返回数据的方式
return {};
},
methods: {
// 组件的方法
},
watch: {
// watch监听方法,擅长处理的场景:一个数据影响多个数据
watch是去监听一个值的变化,然后执行相对应的函数。
},
computed: {
// computed擅长处理的场景:一个数据受多个数据影响
computed是计算属性,也就是依赖其它的属性计算所得出最后的值
},
beforeCreate () {
// 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。
},
created () {
// (在实例创建完成后被立即调用。实例已经创建完成之后被调用。
在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算,
watch/event 事件回调。然而,挂载阶段还没开始,
$el 属性目前不可见。初始化数据请求写这里
},
beforeMount () {
// 在挂载开始之前被调用:相关的 render 函数首次被调用。
},
mounted () {//页面初始化方法
// 编译好的HTML挂载到页面完成后执行的事件钩子
初始化数据除非有依赖dom的放在mounted()里面,加个nextTick
// el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。
// 此钩子函数中一般会做一些ajax请求获取数据进行数据初始化
console.log("Home done");
},
beforeUpdate () {
// 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。
// 只有更新和模板发生关联的数据才会触发这个钩子
// 和模板绑定的数据更新之前
},
updated () {
// 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。
// 当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。
// 该钩子在服务器端渲染期间不被调用。
},
beforeDestroy () {
// 实例销毁之前调用。在这一步,实例仍然完全可用。一般用于清除定时器
//$once来监听定时器,在beforeDestroy钩子可以被清除。
this.$once('hook:beforeDestroy', () => {
clearInterval(timer); })
},
destroyed () {
// Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,
所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。
}
};
</script>