vue組件數(shù)據(jù)自動(dòng)更新sync

首先說下 父子組件傳遞值的問題:
父頁面?zhèn)鹘o子組件使用 props
子組件傳回給父頁面使用 emit
在以前的時(shí)候配喳,子組件的值傳回來后回窘,父頁面需要寫一個(gè)事件用來賦值势就,做不到自動(dòng)更新底哥。(具體怎么使用組件這里就不多說了)
本文就是為了解決這個(gè)麻煩的問題,效果就是谬擦,子組件封裝好后切距,父組件只需要使用 不需要做其他處理。

根據(jù)上面的問題惨远,下面寫一個(gè)組件用來計(jì)數(shù)textarea輸入的值的長度谜悟,有限制字?jǐn)?shù)的功能

(下面是基于vue element框架,ps:element里面有這個(gè)功能北秽,但是有些許不一樣)
element使用如下:

<el-input
  type="textarea"
  placeholder="請輸入內(nèi)容"
  v-model="textarea"
  maxlength="30"
  show-word-limit
>
</el-input>

具體可查看element的文檔https://element.eleme.cn/#/zh-CN/component/input

下面介紹下本人自己寫的組件:(代碼為了可以直接拿去使用葡幸,有些冗余,可以直接滑到最底下看注意點(diǎn))

//子組件完整代碼
<template>
<div class="mytextarea_wrap">
    <div @mouseenter="ishover = true" @mouseleave="ishover = false" :class="{focusPar:isfocus,hoverPar:ishover}">
    <el-input type="textarea"
        v-model="value" 
        :autosize="autosize"
        @input="changeFun"
        @focus="isfocus = true"
        @blur="isfocus = false"
        :placeholder="placeholder">
    </el-input>
    <span class="mytextarea_count" :class="{focus:isfocus,hover:ishover}">{{value.length}}/{{limit}}</span>

    </div>
    <span class="mytextarea_tips" v-show="value.length>limit">輸入字符不能超過{{limit}}個(gè)字符</span>
</div>
</template>

<script>
export default {
    data(){
        return{
           value : this.val || '',
           isfocus : false,
           ishover : false,
        }
    },
    watch: {
        val(nv){
            this.value = nv;
        }
    },
    props: {
        autosize : {
            type : Object,//Array 和 Object 默認(rèn)值必須使用函數(shù)return回來
            default : function () {
                return { minRows: 4, maxRows: 6 }
            }
        },
        placeholder : String,
        limit : {
            type : [String, Number],
            default : 500,
        },

        val : String,
    },
    methods:{
        changeFun(){
            this.$emit('update:val',this.value);
        }
    }
}
</script>

<style lang="scss">
@import '../sass/color';
.mytextarea_wrap{
    .el-textarea__inner{
        border-radius: 4px 4px 0 0;
        border-bottom: none;
        resize: none;
    }
    .mytextarea_count{
        display: block;
        width: 100%;
        box-sizing: border-box;
        font-size: 12px;
        padding: 0 15px;
        height: 24px;
        line-height: 24px;
        text-align: right;
        border-radius: 0 0 4px 4px;
        border: 1px solid #dcdfe6;
        border-top: 0;
        color: #999;
        transition: border-color .2s cubic-bezier(.645,.045,.355,1);
    }
    .mytextarea_count.focus{
        border-color: $pageColor_blue !important;
    }
    .mytextarea_count.hover{
        border-color: #C0C4CC;
    }
    .hoverPar{
        textarea{
            border-color: #C0C4CC;
        }
    }
    .focusPar{
        textarea{
            border-color: $pageColor_blue !important;
        }
    }
    .mytextarea_tips{
        display: block;
        height: 24px;
        line-height: 24px;
        color: $pageColor_red;
        font-size: 12px;
    }
}
</style>

父頁面使用如下:

<textarea-limitnew 
    :val.sync="applyServiceData.reason"
    placeholder="請描述申請售后服務(wù)的具體原因"
    limit="50"
></textarea-limitnew>

需要注意的幾個(gè)位置:

1.props 里面給默認(rèn)值的時(shí)候羡儿,如果type是Array 或 Object礼患,需要使用函數(shù)return回來,如上代碼props里面autosize
2.props 如果type是多個(gè)類型,可用數(shù)組表示缅叠,如上代碼props里面limit
3.props傳進(jìn)來的值 不能被更改悄泥,所以傳進(jìn)來的val, 我們使用value保存一下肤粱,然后操作value弹囚。另外有個(gè)問題,組件只會(huì)在創(chuàng)建的時(shí)候 賦值一次领曼,所以我在頁面加了個(gè)watch監(jiān)聽val鸥鹉,避免出現(xiàn)如下問題:比如我們有個(gè)彈框使用的是v-show,沒用v-if庶骄。彈框里面有這個(gè)組件毁渗,當(dāng)我們第一次打開彈框的時(shí)候val和value都為空,我們編輯后val和value都有值了单刁,然后在父頁面關(guān)掉彈框灸异,并且重置值。接下來再打開彈框的時(shí)候羔飞,會(huì)發(fā)現(xiàn)val在父頁面被清空了肺樟,但是value在子組件里面還是上次的值,所以需要加個(gè)watch再賦值一遍逻淌。(用v-if的話忽略這點(diǎn))
4.如果想在父組件調(diào)用子組件里面的方法(比如函數(shù)名為childFun)么伯,可以給子組件加上ref="test",在父組件中使用this.$refs.test.childFun()就可以調(diào)用到了
5.接下來這點(diǎn)就是本文的主題了卡儒。使用組件的時(shí)候帶上.sync修飾符田柔,然后在子組件里面emit的時(shí)候?qū)懛ㄈ缟洗athis.$emit('update:val',this.value);
update:val里面的val是傳進(jìn)來的值的字段名字。這樣子在父頁面就不需要賦值一次了骨望。

最后效果如下:


image.png
image.png
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凯楔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锦募,更是在濱河造成了極大的恐慌,老刑警劉巖邻遏,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糠亩,死亡現(xiàn)場離奇詭異,居然都是意外死亡准验,警方通過查閱死者的電腦和手機(jī)赎线,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糊饱,“玉大人垂寥,你說我怎么就攤上這事。” “怎么了滞项?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵狭归,是天一觀的道長。 經(jīng)常有香客問我文判,道長过椎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任戏仓,我火速辦了婚禮疚宇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赏殃。我一直安慰自己敷待,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布仁热。 她就那樣靜靜地躺著榜揖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪股耽。 梳的紋絲不亂的頭發(fā)上根盒,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機(jī)與錄音物蝙,去河邊找鬼炎滞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诬乞,可吹牛的內(nèi)容都是我干的册赛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼震嫉,長吁一口氣:“原來是場噩夢啊……” “哼森瘪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起票堵,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤扼睬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后悴势,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窗宇,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年特纤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了军俊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捧存,死狀恐怖粪躬,靈堂內(nèi)的尸體忽然破棺而出担败,到底是詐尸還是另有隱情,我是刑警寧澤镰官,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布提前,位于F島的核電站,受9級特大地震影響朋魔,放射性物質(zhì)發(fā)生泄漏岖研。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一警检、第九天 我趴在偏房一處隱蔽的房頂上張望孙援。 院中可真熱鬧,春花似錦扇雕、人聲如沸拓售。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础淤。三九已至,卻和暖如春哨苛,著一層夾襖步出監(jiān)牢的瞬間鸽凶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工建峭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玻侥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓亿蒸,卻偏偏與公主長得像凑兰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子边锁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360