.sync修饰符
父子组件传值,用的最多最熟的就是 props
和 $emit
了,并且子组件不能直接修改父组件传过来的值。假如需要在子组件中直接修改父组件的值,改完之后也不需要 $emit
也能传递给父组件,需要怎么写呢?
父组件 :state.sync="state"
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <template> <div class ="container-area" > <ChangeState :state.sync="state" /> <div>父组件:{{ state }}</div> </div> </template> <script>import ChangeState from './components/ChangeState.vue' export default { components: { ChangeState }, data ( ) { return { state: true } } } </script>
子组件 this.$emit('update:state', !this.state)
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <template> <div class ="change-state" > 子组件:{{ state }} <el-button @click="change" >切换</el-button> </div> </template> <script>export default { name: 'ChangeState' , props: { state: { type: Boolean , default : true } }, methods: { change ( ) { this .$emit('update:state' , !this .state) } } } </script>
重置data的数据为初始状态
Vue中重置data的数据为初始状态,用的最多最笨的方法就是一个一个去重新赋值,那有没有什么便捷高效的方法呢?试试Object.assign(this.$data, this.$options.data())
吧
栗子:通过 change()
方法修改 data
中的值,再通过 reset()
方法重置 data
的数据为初始状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <template> <div class ="container-area" > <div>姓名:{{ name }}</div> <div>年龄:{{ age }}</div> <div>等级:{{ level }}</div> <div> <el-button @click="change" >改变</el-button> <el-button @click="reset" >重置</el-button> </div> </div> </template> <script>export default { data ( ) { return { name: '11LuckyBOY' , age: 13 , level: 1 } }, methods: { change ( ) { this .name = 'revan' this .age = 18 this .level = 5 }, reset ( ) { Object .assign(this .$data, this .$options.data()) } } } </script>
this.$data
获取当前状态下的 data
this.$options.data()
获取该组件初始状态下的 data
所以,下面就可以将初始状态的data复制到当前状态的 data
,实现重置效果:Object.assign(this.$data, this.$options.data())
当然,如果你只想重置 data
中的某一个对象或者属性:this.form = this.$options.data().form
watch监听对象中的某个属性值 监听对象dialog
中属性值visible
1 2 3 4 5 watch: { 'dialog.visible' (val) { } },
策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换,属于 javascript
内容,暂放本文,平时项目中优先使用。 使用策略模式的优点如下:
策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句
策略模式提供了开放-封闭原则,使代码更容易理解和扩展
策略模式中的代码可以复用
案例
: 比如公司的年终奖是根据员工的工资和绩效来考核的,绩效为 A
的人,年终奖为工资的4倍,绩效为 B
的人,年终奖为工资的3倍,绩效为 C
的人,年终奖为工资的2倍;现在我们使用一般的编码方式会如下这样编写代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var calculateBouns = function (salary,level ) { if (level === 'A' ) { return salary * 4 ; } if (level === 'B' ) { return salary * 3 ; } if (level === 'C' ) { return salary * 2 ; } };console .log(calculateBouns(4000 ,'A' )); console .log(calculateBouns(2500 ,'B' ));
代码缺点如下:
calculateBouns
函数包含了很多if-else
语句。
calculateBouns
函数缺乏弹性,假如还有D等级的话,那么我们需要在 calculateBouns
函数内添加判断等级 D
的 if
语句;
算法复用性差,如果在其他的地方也有类似这样的算法的话,但是规则不一样,我们这些代码不能通用。
使用 Javascript
版本的 策略模式
重构代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var obj = { "A" : function (salary ) { return salary * 4 ; }, "B" : function (salary ) { return salary * 3 ; }, "C" : function (salary ) { return salary * 2 ; } };var calculateBouns =function (level,salary ) { return obj[level](salary); };console .log(calculateBouns('A' ,10000 ));