在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ vuex對(duì)結(jié)構(gòu)不確定的復(fù)雜obj的處理方案?

vuex對(duì)結(jié)構(gòu)不確定的復(fù)雜obj的處理方案?

問題:已知要實(shí)現(xiàn)一個(gè)模板生成系統(tǒng),此系統(tǒng)中,用戶會(huì)選擇模板,然后上傳圖片、文字、視頻,生成一個(gè)新的模板。這個(gè)新的模板可以用來投放到iOS, android,H5各個(gè)端,用來生成原生或H5頁(yè)面。每個(gè)模板其實(shí)都是一個(gè)json文件,標(biāo)識(shí)了一個(gè)h5頁(yè)面的所有信息。換言之,一個(gè)模板就是一個(gè)h5頁(yè)面的json表達(dá)。
json文件如下:

{
    "head": {
        "version": "0.1.0",
        "width": 750,
        "height": 1334,
        "bgColor": "0x000000",
        "landscape": 0,
    },
    "body": {
        "view": "scrollView",
        "subviews": [{
                "view": "page",
                "x": 0,
                "y": 0,
                "width": 750,
                "height": 1334,
                "subviews": [{
                        "view": "video",
                        "x": 0,
                        "y": 0,
                        "width": 750,
                        "height": 422,
                        "custom": {
                            "videoUrl": "http://wxsnsdy.video.qq.com/105/20210/snsdyvideodownload?filekey=30270201010420301e0201690402534804107cc63287148fa491fbf676c7ef5768520203191d970400&hy=SH&storeid=32303137303131373037353131303030303961616365313336666664393330343561333230613030303030303639&bizid=1023",
                            "cover": ""
                        },
                        "subviews": []
                    },
                    {
                        "view": "image",
                        "x": 0,
                        "y": 422,
                        "width": 750,
                        "height": 912,
                        "subviews": [],
                        "custom": {
                            "imgUrl": "http://vweixinthumb.tc.qq.com/109/20204/snsvideodownload?filekey=30270201010420301e02016d040253480410efffdcf15893248926716cd72b710df002030134320400&hy=SH&storeid=32303137303131393031333335303030303639653534313336666664393330333561333230613030303030303664&bizid=1023"
                        }
                    }
                ]
            },
            ...
        ]
    }
}

json文件由于一一對(duì)應(yīng)不同的h5頁(yè)面,所以他們的結(jié)構(gòu)是不固定的,首先是page的數(shù)目不定,有可能是3個(gè)page, 有些是4、5、6、7...其次每個(gè)page里面,組件的個(gè)數(shù)、種類和次序也是不確定的。

系統(tǒng)的demo稿如下:
系統(tǒng)demo稿

當(dāng)前這個(gè)頁(yè)面就是用戶選擇了一個(gè)模板(json)自動(dòng)生成的,當(dāng)點(diǎn)擊圖片和視頻之后,就會(huì)觸發(fā)上傳操作,并用cdn上的url替換當(dāng)前的圖片,用戶點(diǎn)擊了保存之后,就會(huì)上傳修改后的json,并返回修改后的json在cdn上的鏈接。

系統(tǒng)的結(jié)構(gòu)圖如下:
系統(tǒng)組件結(jié)構(gòu)圖

Lander是整個(gè)H5頁(yè)面,LEditor是上面系統(tǒng)demo稿,修改json的部分,LPreview是未來要實(shí)現(xiàn)的預(yù)覽部分,將H5頁(yè)面實(shí)際的渲染在系統(tǒng)的右邊。LEditor和LPreview都是Page組件,Page組件又由多個(gè)其他子組件組成。

重點(diǎn)來了:
因?yàn)樯婕暗蕉鄠€(gè)父子、兄弟組件間的交互,如果直接使用event、props和event bus的方式,會(huì)使得狀態(tài)非常的復(fù)雜,所以想使用vuex做統(tǒng)一的狀態(tài)處理。但是因?yàn)閖son的結(jié)構(gòu)是不確定的,所以初始化mutation只能寫成這個(gè)樣子:

mutations: {
  change (state, json) {
    state.json = json
  }
}
store.commit('change', json)

那么問題就變成了子組件如何找到自己處于json數(shù)據(jù)對(duì)象的某一部分的問題————這樣子組件才能修改自己修改整個(gè)json數(shù)據(jù)。在我的理解中,這個(gè)時(shí)候只能通過父子組件關(guān)系,1對(duì)1的將index傳遞下去,比如說一個(gè)圖片要修改imgURL, 就要得到這個(gè)組件是第2頁(yè)的第1個(gè)輪播圖中的第2個(gè)圖片,這種寫法會(huì)很復(fù)雜和繁瑣。

我想知道是否有更好的解決方案

回答
編輯回答
萌面人

你是怎么知道要修改的是哪個(gè)組件呢?通過點(diǎn)擊嗎?

2017年8月26日 19:25
編輯回答
吢涼

最終我采取了傳index的實(shí)現(xiàn)方案,現(xiàn)在系統(tǒng)開發(fā)完成了,沒有問題,從靈活性上也可以接受。

方案:
父組件:

<div v-if="data.subviews.length">
            <div v-for="(component, cIndex) in data.subviews" :key="component.id">
                <div v-if="component.view == 'video'">
                    <EVideo :data="component" :cIndex="cIndex" :pIndex="pIndex"/>
                </div>
                <div v-if="component.view == 'image' || component.view == 'landscape'">
                    <EImage :data="component" :cIndex="cIndex" :pIndex="pIndex"/>
                </div>
                <div v-if="component.view == 'gallery'">
                    <EGallery :data="component" :cIndex="cIndex" :pIndex="pIndex"/>
                </div>
                <div v-if="component.view == 'button'">
                    <EButton :data="component" :cIndex="cIndex" :pIndex="pIndex"/>
                </div>
            </div>
        </div>

子組件:

export default {
    props: ['data', 'pIndex', 'cIndex'],
    computed: {
        backgroundImage () {
            return 'url(' + this.data.custom.imgUrl + ')';
        }
    },
    methods: {
        successHandler (response, file, fileList) {
            let tempData = this.$store.state.data;
            tempData.body.subviews[this.pIndex].subviews[this.cIndex].custom.imgUrl = response.data.Fcdn_url;
            this.$store.commit('change', tempData);
        }
    }
}
2017年12月16日 04:06