2017-08-14 58 views
2

我有兩個Vue的組件,一個延伸的其他:VueJS延伸部件:去除父屬性

// CompA.vue 

export default { 
    props: { 
     value1: Object, 
    }, 

    data: function() { 
     return { 
      value2: 'hello2 from A', 
      value3: 'hello3 from A' 
     } 
    } 
} 

// CompB.vue 

import CompA from './CompA.vue'; 

export default { 
    extends: CompA, 

    props: { 
     value4: Object 
    }, 

    data: function(){ 
     return { 
      value2: 'hello2 from B' 
     } 
    } 
} 

如上所述in the docs,CompB的的選項被合併成COMPA的,導致:

{ 
    props: { 
     value1: Object, 
     value4: Object 
    }, 

    data: function() { 
     return { 
      value2: 'hello2 from B', 
      value3: 'hello3 from A' 
     } 
    } 
} 

但是我想要的結果是刪除屬性value1

{ 
    props: { 
     value4: Object 
    }, 

    data: function() { 
     return { 
      value2: 'hello2 from B', 
      value3: 'hello3 from A' 
     } 
    } 
} 

我認爲應該可以使用Custom Option Merge Strategies

但即使我返回nullundefined,屬性不會被刪除。

Vue.config.optionMergeStrategies.data = function(parentVal, childVal) { 
    return null; 
}; 

這樣的事情有可能嗎?如果是,如何?

+0

你只是想刪除的對象正在擴展所有屬性? – Bert

+0

不,只有具體的 – balping

回答

2

這不是很清楚Vue.config.optionMergeStrategies是如何工作的,但是這在測試環境中起作用。

import CompA from './CompA.vue'; 
// make a deep clone copy of CompA. Here I'm just using a made up copy 
// function but you could use lodash or some other library. Do NOT use 
// JSON.parse(JSON.stringify(...)) because you will lose functions. Also 
// Object.assign will not work because Object.assign performs a shallow 
// copy (meaning if you delete from props, which is a nested object, you 
// will still globally delete the property). 
import copy from "./utils" 
//copy CompA 
let newCompA = copy(CompA)  
// delete the desired props 
delete newCompA.props.value1 

export default { 
    // extend the copy 
    extends: newCompA, 

    props: { 
     value4: Object 
    }, 

    data: function(){ 
     return { 
      value2: 'hello2 from B' 
     } 
    } 
} 

本質上,在擴展組件之前刪除不需要的道具。

+0

同時我想通了,我的方式是非常類似於你的。不過,我會接受你的,因爲它也可以工作,你應得的。 – balping

+0

雖然我必須注意到,刪除刪除該屬性「全局」導致副作用,即。當使用CompA而不擴展它時,無論如何都會刪除該屬性(因爲刪除語句由於一起編譯而無論如何運行)。但這超出了問題的範圍。 – balping

+0

@balping我只是在考慮這一點。我認爲你的解決方案可能會更好。我正在嘗試CompA的副本,但它不能按預期工作。如果我得到它的工作,我會發布解決方案。 – Bert

2

這是我自己的解決方案,終於爲我工作:在beforeCreate()手動刪除屬性。

這與伯特的答案非常相似。

// CompB.vue 

import CompA from './CompA.vue'; 

export default { 
    extends: CompA, 

    props: { 
     value4: Object 
    }, 

    data: function(){ 
     return { 
      value2: 'hello2 from B' 
     } 
    }, 

    beforeCreate: function(){ 
     Vue.delete(this.$options.props, 'value1'); 
    }, 
} 
1

不知道爲什麼你需要它。 但你也可以做到這一點像以下:

  • 隨着Object.assign

    extends: Object.assign({}, compA, { 
        props: { 
         value4: Object 
        } 
    }), 
    
  • 隨着spread-operator...compA

    extends: { 
        ...compA, 
        props: { 
         value4: Object 
        } 
    } 
    

請看看下面的演示或者這個fiddle

const compA = { 
 
    name: 'CompA', 
 
    template: ` 
 
    \t <div> 
 
    <h2>{{$options.name}}</h2> 
 
    props: <br/> 
 
    <span v-if="$options.name === 'CompA'">1 - {{value1}}<br/></span> 
 
    <span v-if="$options.name === 'CompB'">4 - {{value4}}<br/></span> 
 
    {{value2}}<br/> 
 
    {{value3}} 
 
    </div> 
 
    `, 
 
    props: { 
 
    value1: Object, 
 
    }, 
 

 
    data: function() { 
 
    return { 
 
     value2: 'hello2 from A', 
 
     value3: 'hello3 from A' 
 
    } 
 
    } 
 
} 
 

 
const compB = { 
 
    name: 'CompB', 
 
    extends: Object.assign({}, compA, { 
 
    props: { 
 
     value4: Object 
 
    } 
 
    }), 
 

 
    /* 
 
    // with spread operator 
 
    { 
 
    \t ...compA, 
 
    \t props: { 
 
    \t value4: Object 
 
    } 
 
    },*/ 
 
    data: function() { 
 
    return { 
 
     value2: 'hello2 from B' 
 
    } 
 
    } 
 
} 
 

 
console.log('no prop value1', compB) 
 

 
new Vue({ 
 
    el: '#app', 
 
    components: { 
 
    compA, 
 
    compB 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.2/vue.js"></script> 
 
<div id="app"> 
 
    <comp-a :value1="{id: 2}"> 
 
    </comp-a> 
 
    <comp-b :value1="{id: 4}" :value4="{id: 9}"> 
 
    </comp-b> 
 
</div>

+0

謝謝。我需要它,因爲我想用CompB中的一個屬性作爲可變數據,而不是不可變的道具,但是保留名稱。如果它沒有從道具中移除,你可以在data()中定義它,它仍然是道具。也許這不是最佳實踐,但只要它以可靠的方式工作,我並不在乎。 – balping