compositions-api的优势

可以将每个功能相关的代码放在一个部分,避免代码混乱。后面的示例代码中可以看到,将人物部分的逻辑和标题相关的逻辑可以提取到单独的方法中,如果是正式的项目中,这两块的逻辑比较复杂,可以将它们提取到两个单独的js文件中,类似与vue2中的mixins但是不会出现mixins中各个部分的属性互相影响的问题

createApp

用于创建一个新的Vue应用实例

createApp({
	setup(){
		//......
	}
}).mount('#app')

setup

它是Composition API的入口点。创建组件实例,然后初始化props,紧接着就会调用setup函数。它在beforeCreate钩子之前被调用。

ref

用于给基本类型的数据添加响应式

setup(){
	let title = ref('标题')
	return {title}
}

reactive

用于给对象添加响应式

setup(){
	let persion = reactive({name:'小明'})
	return {persion}
}

ref和reactive的区别

  • ref也可以传入对象,也可以实现响应式,其内部会自动调用reactive方法
  • reactive传入基本类型控制台会出警告,并且不会实现响应式
  • 给ref的响应式对象赋值的时候要用.value的形式赋值

computed

这个计算属性方法,接收一个getter函数,返回一个默认不可手动修改的ref对象

setup(){
	let title = ref('标题')
	let subtitle = computed(()=> '二级' + title.value )
	return {title, subtitle}
}

代码部分

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="app">
    <h2>{{title}}</h2> - <span>{{subTitle}}</span>
    
    <button @click="changeTitle">改变标题</button> 
    <p>姓名:{{form.name}}</p>
    <p>年龄:{{form.age}}</p>
    <button @click="changeAge">改变年龄</button>
  </div>
  <script src="https://unpkg.com/vue@next"></script>
  <script>
    // 引入
    const { createApp, ref, reactive, onMounted,  computed} = Vue;

    // 初始化
    createApp({
      setup(){
        let {title, changeTitle} = titleFn();
        let {form, changeAge} = persionFn();
        
        // 计算属性
        let subTitle = computed(()=> title.value + 1000)
        return {title, changeTitle, form, changeAge, subTitle}; 
      }
    }).mount('#app')

    // 人物相关:引用类型的定义和修改
    function persionFn(){
      let form = reactive({name:'小明',age:66});
      function changeAge(){
        form.age = 100;
      }
      return {form, changeAge}
    }

    // 标题相关:定义和修改基本类型
    function titleFn(){
      let title = ref('标题一');
      function changeTitle(){
        // 注意这里到value里赋值
        title.value = '标题66666666二';
      }

      return {title, changeTitle};
    }
  </script>
</body>
</html>
Logo

前往低代码交流专区

更多推荐