一个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>
Logo

前往低代码交流专区

更多推荐