美文网首页
vue+typescript+vue-property-deco

vue+typescript+vue-property-deco

作者: lmmy123 | 来源:发表于2019-01-31 15:37 被阅读45次

最近的项目使用的技术栈为 vue + typescrit + vue-property-decorator

可以不使用 vue模版组件,通过 'vue-property-decorator'插件,写出oo风格的组件

其中的 v-model 和 .vue 模版有些区别
import { Vue, Component, Prop, Watch } from 'vue-property-decorator'

@Component
export default class Son extends Vue {
    // @Prop ({default: ''}) str! :string
    @Prop () value!: string
    // @Prop ({type: Array}) value!: any[]
    @Prop ({type: Array}) data!: any[]
    @Prop ({type: Number}) num!: number
    // value 是 联动的 是 ‘v-model’ 最好value 结合 model ,
    // 此处是value 结合 tempStr,也可达到效果,但是prop 一定是 value
    // str  不是联动的
    // data 是联动的
    // model = this.value
    tempData = this.data
    tempStr: string = this.value
    tempNum = this.num

    @Watch ('value')
    onValueChange() {
        // this.model = this.value
        this.tempStr = this.value
        console.log('son value changes....')
    }
    @Watch('tempStr')
    onModelChange(val) {
        console.log('son model changes...')
        // this.$emit('input',this.tempStr)
    }
    @Watch ('data') 
    onDataChange() {
        // 此处 数据会联动, 但不会进入到这里
        console.log('data changes')
        this.tempData = this.data
    }
    @Watch ('str') 
    onStrChange() {
        console.log('whosd changes')
        this.tempStr = this.str
    }
    @Watch ('tempStr') 
    onTempArr() {
        console.log('tempArr changes...')
    }
    
    render () {
        return (
            <div style={{width: '100px', height: '50px', border: '1px solid #999'}}>
                <input type="text" v-model={this.tempStr}/>
                <br/>
                <input type="text" v-model={this.tempNum}/>
                <ul>
                    {this.tempData.map(item=>{
                        return (
                            <li>
                                <input v-model={item.age} />
                            </li>
                        )
                    })}
                </ul>
            </div>
        )
    }

}

Prop是 对象时,数据通过 v-model时,改变时,会修改data和Prop,并且会修改 父组件传入的对象,不通过 v-model,通过prop 也可以达到同样效果,命名不要求时 value 和 model
Prop是 字符串,布尔值,数字时,数据通过 v-model时,改变时,会修改data但是不会修改Prop,也不会修改 父组件传入的值
Prop 中是value时,data最好命名为 model,但命名为其他也可以达到效果,
需要在:注意⚠️ 如果value是对象类型时,是不需要下面 $emit()

@Watch('model')
    onModelChange(val) {
        this.$emit('input',this.model)
    }
在父组件中调用
import Son from './Son.tsx'
....
render () {
        return (
            <div style={{width: '200px', height: '100px', border: '1px solid #333'}}>
                 <Son v-model={this.str}  data={this.arrList} ></Son>
            </div>
        )
    }

相关文章

网友评论

      本文标题:vue+typescript+vue-property-deco

      本文链接:https://www.haomeiwen.com/subject/uioksqtx.html