文章目录
文章参考案例说明功能不拆分的写法(Vue2.x传统写法)功能拆分的写法原理说明案例
文章参考
composition-api-introduction
案例说明
功能不拆分的写法(Vue2.x传统写法)
<template>
<div class="count">
<h1>count: {{countState.count}}
</h1>
<p>
<button @click="addCount">添加
</button>
</p>
<p>
<button @click="minusCount">减少
</button>
</p>
</div>
</template>
<script>
import {reactive, isReactive} from 'vue'
export default {
data () {
return {}
},
setup () {
console.log(this)
const countState = reactive({
count: 0
})
console.log(countState)
function addCount () {
countState.count++
}
function minusCount () {
countState.count--
}
return {
countState,
minusCount,
addCount
}
},
methods: {}
}
</script>
<style lang='scss' scoped>
.count{
color: red;
h1{
font-size: 22px;
}
}
</style>
功能拆分的写法
原理说明
由于setup 是在beforeCreate 和 create 生命周期阶段,组件还没有创建,即还没有进入 data 方法 阶段setup 返回的结果集 作为 (传统写法)data 和 method 的值,确切点说是绑定到 组件对象的属性
案例
视图保持不变,将修改Count模块抽出来放到一个函数(countIndexController.js)中 ,该函数要有返回值,提供视图使用
<template>
<div class="count">
<h1>count: {{countState.count}}
</h1>
<p>
<button @click="addCount">添加
</button>
</p>
<p>
<button @click="minusCount">减少
</button>
</p>
</div>
</template>
<script>
import countIndexController from './countIndexController'
export default {
data () {
return {}
},
setup () {
return {
...countIndexController()
}
},
methods: {}
}
</script>
<style lang='scss' scoped>
.count{
color: red;
h1{
font-size: 22px;
}
}
</style>
countIndexController.js 的内容如下
import {reactive
, isReactive
} from 'vue'
export default function countIndexController () {
const countState
= reactive({
count
: 0
})
console
.log(countState
)
function addCount () {
countState
.count
++
}
function minusCount () {
countState
.count
--
}
return {
countState
,
minusCount
,
addCount
}
}
备注说明:
这里尽量使用方法定义,返回一个JSON 对象,保证组件被引用多次时,数据是隔离的。直接返回JSON对象也是可以的,多次引用组件,数据是公共的