vue3 和vue2 开发组件的区别

708 阅读3分钟

1.建立data

vue2中

vue2我们就不说了 ,data中放入两个属性 username password

export default {
  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  }
}

vue3中

在Vue3.0,我们就需要使用一个新的setup()方法,此方法在组件初始化构造的时候触发。 为了可以让开发者对反应型数据有更多的控制,我们可以直接使用到 Vue3 的反应API(reactivity API)

使用以下三步来建立反应性数据:

  1. vue引入reactive

  2. 使用reactive()方法来声明我们的数据为反应性数据

  3. 使用setup()方法来返回我们的反应性数据,从而我们的template可以获取这些反应性数据 上一波代码,让大家更容易理解是怎么实现的。

import { reactive } from 'vue'

export default {
  props: {
    title: String
  },
  setup () {
    const state = reactive({
      username: '',
      password: ''
    })

    return { state }		//记得return
  }
}

2.methods 的编写

vue2

vue2中我们直接放到methods这个方法里面

  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    login () {
      // 登陆方法
    }
  }
}

vue3中

vue3中setup()方法也是可以用来操控methods的。创建声明方法其实和声明数据状态是一样的。 我们需要先声明一个方法然后在setup()方法中返回(return), 这样我们的组件内就可以调用这个方法了。

export default {
  props: {
    title: String
  },
  setup () {
    const state = reactive({
      username: '',
      password: ''
    })

    const login = () => {
      // 登陆方法
    }
    return {
      login,
      state
    }
  }
}

3.生命周期函数

在 Vue2,我们可以直接在组件属性中调用Vue的生命周期的钩子。以下使用一个组件已挂载mounted befortMounted生命周期触发钩子。

export default {
  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  },
  created(){},		
  mounted () {
    console.log('组件已挂载')
  },
  methods: {
    login () {
      // login method
    }
  }
}

vue3中

首先setup()中自带 beforeCreated created 也就是说 我们不用在想vue2中一样去created中去调用获取数据了。但是在 Vue3 生周期钩子不是全局可调用的了,需要另外从vue中引入。和刚刚引入reactive一样,生命周期的挂载钩子叫onMounted。 引入后我们就可以在setup()方法里面使用onMounted挂载的钩子了

import { reactive, onMounted } from 'vue'

export default {
  props: {
    title: String
  },
  setup () {
    // ..
    const getData = ()=> {
    	$axios()	//获取数据
    }

    onMounted(() => {
      console.log('组件已挂载')
    })

    // ...
    return {
    	getData
    }
  }
}

4. 计算属性 - Computed

vue2中

在 Vue2 中实现,我们只需要在组件内的选项属性中添加即可

export default {
  // ..
  computed: {
    lowerCaseUsername () {
      return this.username.toLowerCase()
    }
  }
}

vue3中

Vue3 的设计模式给予开发者们按需引入需要使用的依赖包。这样一来就不需要多余的引用导致性能或者打包后太大的问题。Vue2就是有这个一直存在的问题。 所以在 Vue3 使用计算属性,我们先需要在组件内引入computed

import { reactive, onMounted, computed } from 'vue'
//引入 computed
export default {
  props: {
    title: String
  },
  setup () {
    const state = reactive({
      username: '',
      password: '',
      lowerCaseUsername: computed(() => state.username.toLowerCase())
    })

    // ...
  }

4.接受props

vue2中

在 Vue2,this代表的是当前组件,不是某一个特定的属性。所以我们可以直接使用this访问prop属性值。就比如下面的例子在挂载完成后打印出当前传入组件的参数title

export default {
  props: {
    title: String
  },
  data () {
    return {
      username: '',
      password: ''
    }
  },
  created(){},		
  mounted () {
    console.log('组件已挂载')
  },
  methods: {
    login () {
      // login method
     console.log( this.props.title	)		//打印title
    }
  }
}

vue3中

vue3中取消了this。不过全新的setup()方法可以接收两个参数:

  1. props 组件参数
  2. ccontext vue3 暴露属性 比如 emit attrs 所以 vue3中接受props
setup (props) {
    // ...

    onMounted(() => {
      console.log('title: ' + props.title)
    })

    // ...
}

5.emit

vue2中

Vue2 中我们会调用到this.$emit然后传入事件名和参数对象。

login () {
     this.$emit('login', {			//触发父组件方法
       username: this.username,
       password: this.password
     })
}

vue3中

setup()中的第二个参数context对象中就有emit,这个是和this.$emit是一样的。那么我们只要在setup()接收第二个参数中使用分解对象法取出emit就可以在setup方法中随意使用了。

setup (props, { emit }) {
    // ... 暴露属性 emit
		//相当于 this.$emit = emit
    const login = () => {
      emit('login', {
        username: state.username,
        password: state.password
      })
    }

    // ...
}

总结一下

总结一下,我觉得 Vue3 给我们前端开发者带来了全新的开发体验,更好的使用弹性,可控度也得到了大大的提升。如果你是一个学过或者接触过 React 然后现在想使用Vue的话,应该特别兴奋,因为很多使用方式都和React hooks非常相近了 🎉,vue3 借鉴了很多react hooksvue3中不再提供 this 。对于 ** this** 而言 ,相对于初学者来说是固定的 this 指向当前这个实例,我需要啥就去this中拿, 容易理解使用。而vue3 更自定义 ,我需要啥就要先引入或者先暴露啥,不再是像vue2中一样 this中都给你包含了。