代碼結(jié)構(gòu):頁面根據(jù)pageList這個數(shù)組里面的對象,動態(tài)渲染。有一個設(shè)置欄,上面有很多按鈕對應(yīng)一個個不同的模塊,每次點擊就會往pageList內(nèi)添加對象,頁面從而渲染出不同的模塊,模塊時可以復用的。當我添加了兩個一樣的模塊,例如輔助區(qū)域,當我點擊右側(cè)輔助區(qū)域設(shè)置欄的時候,兩個輔助區(qū)域的是一起動的!這就是問題所在!別的模塊也是如此!
pageList默認是空;
<!-- 根據(jù)pageList列表內(nèi)部對象的status值,判斷使用哪種樣式模板 -->
<div v-for="(item,index) in pageList" :key="index">
<!-- 輔助區(qū)域 -->
<div class="support_box" v-if="item.status==1">
<button @click="showIndex(item.status,index)" :style="{backgroundColor: item.supportInfo.lineBgc}"> <!--這里對應(yīng)的是輔助分割線的背影顏色==》backgroundColor-->
<!-- 輔助空白 -->
<div v-show="item.supportInfo.supportStatus==0" class="empty_box" :style="{ backgroundColor: item.supportInfo.emptyBgc, height: item.supportInfo.emptyHeight + 'px' }"></div>
<!-- 輔助線段 樣式太多,只能采取對象-->
<!--對應(yīng)關(guān)系==》borderTopColor:線段顏色 borderTop/style/color/width:對應(yīng)線段的樣式顏色寬度 marginTop/bottom:對應(yīng)上下邊距 -->
<div v-show="item.supportInfo.supportStatus==1" class="line_box" :style="{ borderTopColor: item.supportInfo.lineColor,borderTopStyle:item.supportInfo.lineStyle,borderTopColor:item.supportInfo.lineColor, borderTopWidth: item.supportInfo.lineHeight + 'px' ,marginTop: item.supportInfo.lineMargin + 'px',marginBottom: item.supportInfo.lineMargin + 'px'}"></div>
<!-- 模塊刪除按鈕 -->
<div class="del_li" @click="model_del_li(index)">X</div>
</button>
<!-- #######輔助區(qū)域欄 #####-->
<!-- 先根據(jù)status判斷該顯示那一種設(shè)置框,然后判斷具體是哪一個的設(shè)置框,每次只顯示一個 -->
<div v-show="1==isShow && index==listIndex" class="support_set">
<el-form label-width="80px">
<el-form-item label="輔助類型">
<el-radio-group v-model="item.supportInfo.supportStatus">
<el-radio label="0">輔助空白</el-radio>
<el-radio label="1">輔助分割線</el-radio>
</el-radio-group>
</el-form-item>
<!-- ####### 輔助空白設(shè)置欄 ############ -->
<div v-show="item.supportInfo.supportStatus==0">
<el-form-item label="背景顏色">
<el-color-picker v-model="item.supportInfo.emptyBgc"></el-color-picker>
</el-form-item>
<el-form-item label="區(qū)域高度" class="slider_box">
<el-slider class="slider_set" v-model="item.supportInfo.emptyHeight" :min="1" :max="40" show-stops>
</el-slider>
<span>{{item.supportInfo.emptyHeight}}px</span>
</el-form-item>
</div>
<!-- ########### 輔助分割線設(shè)置欄 ################ -->
<div v-show="item.supportInfo.supportStatus==1">
<el-form-item label="背景顏色">
<el-color-picker v-model="item.supportInfo.lineBgc"></el-color-picker>
</el-form-item>
<el-form-item label="線段顏色">
<el-color-picker v-model="item.supportInfo.lineColor"></el-color-picker>
</el-form-item>
<el-form-item label="線段樣式">
<el-radio-group v-model="item.supportInfo.lineStyle">
<el-radio label="solid">實線</el-radio>
<el-radio label="dashed">虛線</el-radio>
<el-radio label="dotted">點狀線</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="線段高度" class="slider_box">
<el-slider class="slider_set" v-model="item.supportInfo.lineHeight" :min="1" :max="40" show-stops>
</el-slider>
<span>{{item.supportInfo.lineHeight}}px</span>
</el-form-item>
<el-form-item label="上下邊距" class="slider_box">
<el-slider class="slider_set" v-model="item.supportInfo.lineMargin" :min="1" :max="40" show-stops>
</el-slider>
<span>{{item.supportInfo.lineMargin}}px</span>
</el-form-item>
</div>
</el-form>
</div>
</div>
{ //輔助區(qū)域數(shù)據(jù)
status: 1,
title: "輔助區(qū)域1",
supportInfo: {
supportStatus: "0", //輔助類型 0:空白 1:分割線 ==》默認是輔助空白0
emptyBgc: "#000", //空白區(qū)域背景顏色
emptyHeight: "20", //空白區(qū)域高度==>不需要帶px單位
//下面是輔助分割線區(qū)域
lineBgc: "#fff", //分割線背景顏色
lineColor: "#0099bc", //分割線線段顏色
lineStyle: "solid", //線段樣式:實線solid 虛線dashed 點狀線dotted ==》默認實線solid
lineHeight: "10", //線段高度==>不需要帶px單位
lineMargin: "10", //線段上下邊距==>不需要帶px單位
}
}
自己嘗試的解決方法:為左側(cè)的展示欄添加 :key="index"
為右側(cè)的設(shè)置欄添加 :key="index"
以及每次將默認的輔助區(qū)域數(shù)據(jù)push到pageList之前為它增加一個鍵值對(--time:new Date()--),聲明它的唯一性!
但是問題依舊,感覺像是右側(cè)的設(shè)置欄被指向同一個數(shù)據(jù)!
下面是pageList添加邏輯的代碼,allList是數(shù)組,內(nèi)部是每個模塊默認的數(shù)據(jù),根據(jù)點擊的index值判斷應(yīng)該push哪一組數(shù)據(jù)
addModel(index) {
this.pageList.push(this.allList[index])
},
修改了代碼如下:
let data = Object.assign({}, this.allList[index]);
this.pageList.push(data)
問題依舊:
按照諾頓大師兄的方法已經(jīng)解決:
let data = Object.assign({}, JSON.parse(JSON.stringify(this.allList[index])));
this.pageList.push(data)
你可以嘗試一下下邊的代碼
var obj = {
a:1,
b:2
}
var arr1 = []
arr1.push(obj)
var arr2 = []
arr2.push(obj)
obj.b = 3
會發(fā)現(xiàn) arr1
和arr2
中的obj.b
都是3了。
原因是對象是引用類型,傳遞的是引用地址,所以你兩個數(shù)組引用的是同一個對象,只要其中一個數(shù)組改變,就會導致對象改變,進而另一個引用的數(shù)組也會改。
解決辦法就是將需要放入數(shù)組的對象先深拷貝一份,用拷貝的對象,這樣就不存在引用關(guān)系了。
Object.assign({},需要push的對象)
可以,用lodash
中的assign
也行,只要是深拷貝就行。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務(wù)外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務(wù)負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。