Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
hello-uvue
提交
b3ea6bb4
H
hello-uvue
项目概览
DCloud
/
hello-uvue
通知
371
Star
3
Fork
8
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hello-uvue
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
b3ea6bb4
编写于
1年前
作者:
Y
yurj26
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: add nested component communication example
上级
55d2b58c
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
469 addition
and
358 deletion
+469
-358
pages.json
pages.json
+7
-0
pages/examples/nested-component-communication/components/child.vue
...mples/nested-component-communication/components/child.vue
+28
-0
pages/examples/nested-component-communication/components/grandChild.vue
.../nested-component-communication/components/grandChild.vue
+31
-0
pages/examples/nested-component-communication/nested-component-communication.uvue
...mponent-communication/nested-component-communication.uvue
+27
-0
pages/index.uvue
pages/index.uvue
+368
-356
store/index.uts
store/index.uts
+8
-2
未找到文件。
pages.json
浏览文件 @
b3ea6bb4
...
...
@@ -237,6 +237,13 @@
"navigationBarTitleText"
:
"template"
,
"enablePullDownRefresh"
:
false
}
},
{
"path"
:
"pages/examples/nested-component-communication/nested-component-communication"
,
"style"
:
{
"navigationBarTitleText"
:
"嵌套组件通信"
,
"enablePullDownRefresh"
:
false
}
}
],
"globalStyle"
:
{
...
...
This diff is collapsed.
Click to expand it.
pages/examples/nested-component-communication/components/child.vue
0 → 100644
浏览文件 @
b3ea6bb4
<
template
>
<view
class=
"child"
>
子组件:
{{
msg
}}
<grand-child></grand-child>
</view>
</
template
>
<
script
>
import
grandChild
from
'
./grandChild
'
import
{
state
}
from
'
@/store/index.uts
'
export
default
{
components
:
{
grandChild
},
computed
:
{
msg
():
number
{
return
state
.
componentMsg
}
}
}
</
script
>
<
style
>
.child
{
margin-top
:
10px
;
}
</
style
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
pages/examples/nested-component-communication/components/grandChild.vue
0 → 100644
浏览文件 @
b3ea6bb4
<
template
>
<view
class=
"child"
>
孙组件:
{{
msg
}}
<button
@
click=
"change"
>
孙组件清空数据
</button>
</view>
</
template
>
<
script
>
import
{
state
,
setComponentMsg
}
from
'
@/store/index.uts
'
export
default
{
computed
:
{
msg
():
number
{
return
state
.
componentMsg
}
},
methods
:
{
change
()
{
setComponentMsg
(
0
)
}
}
}
</
script
>
<
style
>
.child
{
margin-top
:
10px
;
}
</
style
>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
pages/examples/nested-component-communication/nested-component-communication.uvue
0 → 100644
浏览文件 @
b3ea6bb4
<template>
<view class="page">
父组件: {{ msg }}
<button @click="change">父组件改变数据</button>
<child></child>
</view>
</template>
<script>
import child from './components/child'
import { setComponentMsg, state } from '@/store/index.uts'
export default {
components: {
child
},
computed: {
msg() : number {
return state.componentMsg
}
},
methods: {
change() {
setComponentMsg(state.componentMsg + 1)
}
}
}
</script>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
pages/index.uvue
浏览文件 @
b3ea6bb4
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<view class="uni-container">
<view class="uni-panel" v-for="(item, index) in list" :key="item.id">
<view class="uni-panel-h" @click="triggerCollapse(item, index)">
<text class="uni-panel-text">{{ item.name }}</text>
<!-- <text class="uni-panel-icon uni-icon" :class="item.open ? 'uni-panel-icon-on' : ''">{{item.open ? '' : ''}}</text> -->
</view>
<view class="uni-panel-c" v-if="item.open">
<view class="uni-navigate-item" v-for="page in item.pages" :key="page.name"
@click="goDetailPage(item.id, page)">
<text class="uni-navigate-text" :class="page.enable != true ? 'text-disabled' : ''">{{ page.name }}</text>
<!-- <text class="uni-navigate-icon uni-icon"></text> -->
</view>
</view>
</view>
</view>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<view class="uni-container">
<view class="uni-panel" v-for="(item, index) in list" :key="item.id">
<view class="uni-panel-h" @click="triggerCollapse(item, index)">
<text class="uni-panel-text">{{ item.name }}</text>
<!-- <text class="uni-panel-icon uni-icon" :class="item.open ? 'uni-panel-icon-on' : ''">{{item.open ? '' : ''}}</text> -->
</view>
<view class="uni-panel-c" v-if="item.open">
<view class="uni-navigate-item" v-for="page in item.pages" :key="page.name"
@click="goDetailPage(item.id, page)">
<text class="uni-navigate-text" :class="page.enable != true ? 'text-disabled' : ''">{{ page.name }}</text>
<!-- <text class="uni-navigate-icon uni-icon"></text> -->
</view>
</view>
</view>
</view>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script>
import { setLifeCycleNum, state } from '@/store/index.uts'
import { setLifeCycleNum, state } from '@/store/index.uts'
type PageItem = {
name : string
enable ?: boolean
url ?: string
}
type PageItem = {
name : string
enable ?: boolean
url ?: string
}
type PageList = {
id : string
name : string
open : boolean
pages : PageItem[]
url ?: string
enable ?: boolean
}
type PageList = {
id : string
name : string
open : boolean
pages : PageItem[]
url ?: string
enable ?: boolean
}
export default {
data() {
return {
list: [
{
id: 'lifecycle',
name: '生命周期',
open: false,
pages: [
{
name: 'page',
url: 'page',
enable: true,
},
{
name: 'component',
url: 'component',
enable: true,
},
] as PageItem[],
},
{
id: 'directive',
name: '指令',
open: false,
pages: [
{
name: 'v-for',
url: 'v-for',
enable: true,
},
{
name: 'v-for-item-click',
url: 'v-for/v-for-item-click',
enable: true,
},
{
name: 'v-for-item-v-if',
url: 'v-for/v-for-item-v-if',
enable: true,
},
{
name: 'v-for-item-v-show',
url: 'v-for/v-for-item-v-show',
enable: true,
},
{
name: 'v-for-v-for',
url: 'v-for/v-for-v-for',
enable: true,
},
{
name: 'v-if',
url: 'v-if',
enable: true,
},
{
name: 'v-show',
url: 'v-show',
enable: true,
},
{
name: 'v-on',
url: 'v-on',
enable: true,
},
{
name: 'v-bind',
url: 'v-bind',
enable: true,
},
{
name: 'v-bind-class',
url: 'v-bind/v-bind-class',
enable: true,
},
{
name: 'v-bind-style',
url: 'v-bind/v-bind-style',
enable: true,
},
{
name: 'v-bind-props',
url: 'v-bind/v-bind-props',
enable: true,
},
{
name: 'v-bind-attribute',
url: 'v-bind/v-bind-attribute',
enable: false,
},
{
name: 'v-model',
url: 'v-model',
enable: true,
},
{
name: 'v-slot',
url: 'v-slot',
enable: true,
},
{
name: 'v-pre',
url: 'v-pre',
enable: false,
},
{
name: 'v-once',
url: 'v-once',
enable: false,
},
{
name: 'v-memo',
url: 'v-memo',
enable: false,
},
{
name: 'v-cloak',
url: 'v-cloak',
enable: false,
},
] as PageItem[],
},
{
id: 'state',
name: '状态',
open: false,
pages: [
{
name: 'data',
url: 'data',
enable: true,
},
{
name: 'props',
url: 'props',
enable: true,
},
{
name: 'computed',
url: 'computed',
enable: true,
},
{
name: 'methods',
url: 'methods',
enable: true,
},
{
name: 'watch',
url: 'watch',
enable: true,
},
] as PageItem[],
},
{
id: 'rendering',
name: '渲染选项',
open: false,
pages: [
{
name: 'template',
url: 'template',
enable: true,
},
{
name: 'render',
url: 'render',
enable: false,
},
{
name: 'slots',
url: 'slots',
enable: true,
},
] as PageItem[],
},
{
id: 'component-instance',
name: '组件实例',
open: false,
pages: [
{
name: '$data',
url: 'data',
enable: true,
},
{
name: '$props',
url: 'props',
enable: true,
},
{
name: '$el',
url: 'el',
enable: true,
},
{
name: '$options',
url: 'options',
enable: true,
},
{
name: '$parent',
url: 'parent',
enable: true,
},
{
name: '$root',
url: 'root',
enable: true,
},
{
name: '$slots',
url: 'slots',
enable: true,
},
{
name: '$refs',
url: 'refs',
enable: true,
},
{
name: '$attrs',
url: 'attrs',
enable: true,
},
{
name: '$watch',
url: 'watch-function',
enable: true,
},
{
name: '$emit',
url: 'emit-function',
enable: true,
},
{
name: '$forceUpdate',
url: 'forceUpdate-function',
enable: false,
},
{
name: '$nextTick',
url: 'nextTick-function',
enable: true,
},
] as PageItem[],
},
{
id: 'composition',
name: '组合选项',
open: false,
pages: [
{
name: 'provide',
url: 'provide',
enable: false,
},
{
name: 'inject',
url: 'inject',
enable: false,
},
{
name: 'mixins',
url: 'mixins',
enable: false,
},
{
name: 'extends',
url: 'extends',
enable: false,
},
] as PageItem[],
},
] as PageList[],
}
},
methods: {
triggerCollapse(_ : PageList, index : number) {
this.list[index].open = !this.list[index].open
},
goDetailPage(id : string, e : PageItem) {
if (e.enable == false) {
uni.showToast({
icon: 'none',
title: '暂不支持',
})
return
}
export default {
data() {
return {
list: [
{
id: 'lifecycle',
name: '生命周期',
open: false,
pages: [
{
name: 'page',
url: 'page',
enable: true,
},
{
name: 'component',
url: 'component',
enable: true,
},
] as PageItem[],
},
{
id: 'directive',
name: '指令',
open: false,
pages: [
{
name: 'v-for',
url: 'v-for',
enable: true,
},
{
name: 'v-for-item-click',
url: 'v-for/v-for-item-click',
enable: true,
},
{
name: 'v-for-item-v-if',
url: 'v-for/v-for-item-v-if',
enable: true,
},
{
name: 'v-for-item-v-show',
url: 'v-for/v-for-item-v-show',
enable: true,
},
{
name: 'v-for-v-for',
url: 'v-for/v-for-v-for',
enable: true,
},
{
name: 'v-if',
url: 'v-if',
enable: true,
},
{
name: 'v-show',
url: 'v-show',
enable: true,
},
{
name: 'v-on',
url: 'v-on',
enable: true,
},
{
name: 'v-bind',
url: 'v-bind',
enable: true,
},
{
name: 'v-bind-class',
url: 'v-bind/v-bind-class',
enable: true,
},
{
name: 'v-bind-style',
url: 'v-bind/v-bind-style',
enable: true,
},
{
name: 'v-bind-props',
url: 'v-bind/v-bind-props',
enable: true,
},
{
name: 'v-bind-attribute',
url: 'v-bind/v-bind-attribute',
enable: false,
},
{
name: 'v-model',
url: 'v-model',
enable: true,
},
{
name: 'v-slot',
url: 'v-slot',
enable: true,
},
{
name: 'v-pre',
url: 'v-pre',
enable: false,
},
{
name: 'v-once',
url: 'v-once',
enable: false,
},
{
name: 'v-memo',
url: 'v-memo',
enable: false,
},
{
name: 'v-cloak',
url: 'v-cloak',
enable: false,
},
] as PageItem[],
},
{
id: 'state',
name: '状态',
open: false,
pages: [
{
name: 'data',
url: 'data',
enable: true,
},
{
name: 'props',
url: 'props',
enable: true,
},
{
name: 'computed',
url: 'computed',
enable: true,
},
{
name: 'methods',
url: 'methods',
enable: true,
},
{
name: 'watch',
url: 'watch',
enable: true,
},
] as PageItem[],
},
{
id: 'rendering',
name: '渲染选项',
open: false,
pages: [
{
name: 'template',
url: 'template',
enable: true,
},
{
name: 'render',
url: 'render',
enable: false,
},
{
name: 'slots',
url: 'slots',
enable: true,
},
] as PageItem[],
},
{
id: 'component-instance',
name: '组件实例',
open: false,
pages: [
{
name: '$data',
url: 'data',
enable: true,
},
{
name: '$props',
url: 'props',
enable: true,
},
{
name: '$el',
url: 'el',
enable: true,
},
{
name: '$options',
url: 'options',
enable: true,
},
{
name: '$parent',
url: 'parent',
enable: true,
},
{
name: '$root',
url: 'root',
enable: true,
},
{
name: '$slots',
url: 'slots',
enable: true,
},
{
name: '$refs',
url: 'refs',
enable: true,
},
{
name: '$attrs',
url: 'attrs',
enable: true,
},
{
name: '$watch',
url: 'watch-function',
enable: true,
},
{
name: '$emit',
url: 'emit-function',
enable: true,
},
{
name: '$forceUpdate',
url: 'forceUpdate-function',
enable: false,
},
{
name: '$nextTick',
url: 'nextTick-function',
enable: true,
},
] as PageItem[],
},
{
id: 'composition',
name: '组合选项',
open: false,
pages: [
{
name: 'provide',
url: 'provide',
enable: false,
},
{
name: 'inject',
url: 'inject',
enable: false,
},
{
name: 'mixins',
url: 'mixins',
enable: false,
},
{
name: 'extends',
url: 'extends',
enable: false,
},
] as PageItem[],
},
{
id: 'examples',
name: '示例',
open: false,
pages: [
{
name: '嵌套组件通信',
url: 'nested-component-communication',
enable: true,
}
] as PageItem[],
},
] as PageList[],
}
},
methods: {
triggerCollapse(_ : PageList, index : number) {
this.list[index].open = !this.list[index].open
},
goDetailPage(id : string, e : PageItem) {
if (e.enable == false) {
uni.showToast({
icon: 'none',
title: '暂不支持',
})
return
}
const url = e.url!.includes('/') ? e.url : `${e.url}/${e.url}`
uni.navigateTo({
url: `/pages/${id}/${url}`,
})
},
// 自动化测试
setLifeCycleNum(num : number) {
setLifeCycleNum(num)
},
// 自动化测试
getLifeCycleNum() : number {
return state.lifeCycleNum
},
},
}
const url = e.url!.includes('/') ? e.url : `${e.url}/${e.url}`
uni.navigateTo({
url: `/pages/${id}/${url}`,
})
},
// 自动化测试
setLifeCycleNum(num : number) {
setLifeCycleNum(num)
},
// 自动化测试
getLifeCycleNum() : number {
return state.lifeCycleNum
},
},
}
</script>
<style>
.arrow {
width: 8px;
height: 8px;
border-top: 2px solid #ccc;
border-left: 2px solid #ccc;
}
.arrow {
width: 8px;
height: 8px;
border-top: 2px solid #ccc;
border-left: 2px solid #ccc;
}
.arrow-right {
transform: rotate(135deg);
}
.arrow-right {
transform: rotate(135deg);
}
.arrow-up {
transform: rotate(45deg);
}
.arrow-up {
transform: rotate(45deg);
}
.arrow-down {
transform: rotate(-135deg);
}
.arrow-down {
transform: rotate(-135deg);
}
</style>
\ No newline at end of file
This diff is collapsed.
Click to expand it.
store/index.uts
浏览文件 @
b3ea6bb4
export type State = {
lifeCycleNum: number
componentMsg: number
}
export const state = reactive({
lifeCycleNum: 0
lifeCycleNum: 0,
componentMsg: 0
} as State)
export const setLifeCycleNum = (num: number) => {
state.lifeCycleNum = num
}
\ No newline at end of file
}
export const setComponentMsg = (msg: number) => {
state.componentMsg = msg
}
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录