2021.11.24 Vue2 使用Vue實(shí)現(xiàn)對(duì)數(shù)組的增刪改查 & vue的生命周期 & 輪播圖例子

一沥曹、使用Vue實(shí)現(xiàn)對(duì)數(shù)組的增刪改查

在管理員的一些后臺(tái)頁面里,個(gè)人中心里的數(shù)據(jù)列表里溺蕉,都會(huì)有對(duì)這些數(shù)據(jù)進(jìn)行增刪改查的操作福压。比如在管理員后臺(tái)的用戶列表里,我們可以錄入新用戶的信息蛮放,也可以對(duì)既有的用戶信息進(jìn)行修改缩抡。在vue中,我們更應(yīng)該專注于對(duì)數(shù)據(jù)的操作和處理包颁。

比如我們有這樣的的一個(gè)頁面


列表的增刪改查.jpg

樣式

 <style>
        table{
            border-collapse: collapse;
        }
        th,td{
            padding: 2px 15px;
            border: 1px solid #ccc;
            text-align: center;
        }
        #edit{
            width: 300px;
            height: 230px;
            border: 1px solid #ccc;
            padding: 20px;
            position: fixed;
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            margin: auto;
        }
        #edit .close{
            width: 30px;
            height: 30px;
            border: 1px solid #ccc;
            background-color: lightcoral;
            color: white;
            text-align: center;
            line-height: 30px;
            font-size: 20px;
            border-radius: 50%;
            cursor: pointer;
            position: absolute;
            right: 10px;
            top: 10px;
        }
    </style>

頁面

<div id="app">
        <button @click="showEdit=true">添加</button>
        <hr>
        <table>
            <thead>
                <tr>
                    <th>學(xué)號(hào)</th>
                    <th>姓名</th>
                    <th>年齡</th>
                    <th>性別</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <tr v-for="(item,index) in students" :key="index">
                    <td>{{item.no}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.age}}</td>
                    <td>{{item.sex}}</td>
                    
                    <td>
                        <button @click="getOne(item.no)">修改</button>
                        <button @click="delStudent(index)">刪除</button>
                    </td>
                </tr>
            </tbody>
        </table>

        <div id="edit" v-show="showEdit">
            <!-- 在修改界面中瞻想,不能修改學(xué)號(hào) -->
            <p>學(xué)號(hào):<input type="text" v-model="student.no" :readonly="!isAdd"></p>
            <p>姓名:<input type="text" v-model="student.name"></p>
            <p>年齡:<input type="text" v-model="student.age"></p>
            <p>性別:<input type="text" v-model="student.sex"></p>
            <p>
                <button v-if="isAdd" @click="addStudent">添加</button>
                <button v-else @click="updateStudent">修改</button>
                <button @click="clear">取消</button>
            </p>
            <div class="close" @click="close">X</div>
        </div>
    </div>

// 引入vue.js文件


    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>

定義一個(gè)學(xué)生數(shù)組

        new Vue({
            el:'#app',
            data:{
                //定義一個(gè)學(xué)生數(shù)組
                students:[
                    {
                        no:'1001',
                        name:'劉德華',
                        age:20,
                        sex:'男'
                    },
                    {
                        no:'1002',
                        name:'周杰倫',
                        age:22,
                        sex:'男'
                    },
                    {
                        no:'1003',
                        name:'蔡依林',
                        age:24,
                        sex:'女'
                    }
                ],

是否顯示編輯窗口(接上)
showEdit:false,

是否是添加狀態(tài)
isAdd:true,

學(xué)生對(duì)象

student:{
                    no:'',
                    name:'',
                    age:0,
                    sex:''
                }
            },
 methods: {
                //添加方法
                addStudent(){
                    //將表單數(shù)據(jù)展開后,返回一個(gè)新的對(duì)象
                    let stu = {...this.student} 
                    //將學(xué)生對(duì)象添加到學(xué)生數(shù)組中
                    this.students.push(stu)
                    //調(diào)用清空表單數(shù)據(jù)的方法
                    this.clear()
                },
                //清空表單數(shù)據(jù)的方法
                clear(){
                    this.student = {
                        no:'',
                        name:'',
                        age:0,
                        sex:''
                    }
                },
                //關(guān)閉編輯窗口
                close(){
                    this.showEdit = false
                    this.isAdd = true
                    this.clear()
                },
                //根據(jù)學(xué)號(hào)查詢學(xué)生對(duì)象
                getOne(no){
                    //打開編輯窗口
                    this.showEdit = true
                    //編輯窗口是修改狀態(tài)
                    this.isAdd = false
                    //根據(jù)學(xué)號(hào)查詢學(xué)生對(duì)象
                    let stu = this.students.find(s=>s.no===no)
                    this.student = {...stu}
                },
                //修改學(xué)生信息
                updateStudent(){
                    //根據(jù)學(xué)號(hào)娩嚼,找到原始數(shù)組中指定的學(xué)生對(duì)象
                    let stu = this.students.find(s=>s.no===this.student.no)
                    //修改數(shù)組里面指定學(xué)生對(duì)象的屬性
                    stu.name = this.student.name
                    stu.age = this.student.age
                    stu.sex = this.student.sex
                },
                //刪除學(xué)生
                delStudent(index){
                    if(confirm('確定刪除嗎蘑险?')){
                        this.students.splice(index,1)
                    }
                }
            },
        })

點(diǎn)擊添加后效果如圖


列表的.jpg

總結(jié):
里面的難點(diǎn)不太多,主要是form表單方面的操作岳悟,再一個(gè)就是練習(xí)下組件間的數(shù)據(jù)與事件傳遞佃迄。內(nèi)容比較簡(jiǎn)單,歡迎各位批評(píng)指正贵少。

二呵俏、vue的生命周期

1.簡(jiǎn)單寫個(gè)頁面

 <div id="app">
        <h2 id="name">{{name}}</h2>
        <h2 id="age">{{age}}</h2>
        <div>
            <button @click="name='李四'">修改姓名</button>
            <button @click="age=30">修改年齡</button>
            <button @click="destroy">不過了</button>
        </div>
    </div>

// 引入vue文件

<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>
 <script>
        Vue.config.productionTip = false
        let vm = new Vue({
            // 指定掛載的容器
            // el:'#app',
            // 指定模板(如果有模板,vue會(huì)渲染整個(gè)模板滔灶;如果沒有模板普碎,vue會(huì)將el里面的所有內(nèi)容當(dāng)成模板使用)
            // template:'<div><h2>{{name}}</h2><h2>{{age}}</h2></div>',
            //數(shù)據(jù)
            data:{
                name:'張三',
                age:20,
            },
            methods: {
                destroy(){
                    // 調(diào)用銷毀當(dāng)前Vue實(shí)例的方法
                    // 注意:銷毀后,當(dāng)前Vue實(shí)例對(duì)象還在录平,只是該對(duì)象不能在重新掛載頁面了
                    this.$destroy()
                }
            },
            //創(chuàng)建之前(數(shù)據(jù)初始化之前)
            beforeCreate() {
                console.log('-----------------beforeCreate------------------');
                // 這個(gè)生命周期函數(shù)麻车,基本上不用缀皱,除非要設(shè)置Vue實(shí)例的內(nèi)容
                this.__proto__.fn = function(){
                    alert('哈哈!')
                }

                //Vue實(shí)例动猬,已經(jīng)創(chuàng)建完成
                console.log(this);
                //Vue實(shí)例身上的數(shù)據(jù)還沒有初始化完成
                console.log(this.name+' '+this.age);
            },
            //創(chuàng)建完成(數(shù)據(jù)初始化完成)
            created() {
                console.log('-----------------created------------------');
                // 這個(gè)生命周期函數(shù)啤斗,通常用于初始化Vue管理的數(shù)據(jù),比如:發(fā)生ajax請(qǐng)求會(huì)放在這里赁咙。
                console.log(this);
                console.log(this.name+' '+this.age);
            },
            //掛載之前(模板已經(jīng)成功渲染钮莲,但是還沒有將內(nèi)容掛載到頁面中)
            beforeMount() {
                console.log('-----------------beforeMount------------------');
                // 這個(gè)生命周期函數(shù),基本上不用
                console.log(this.$el);
                // document.querySelector('#name').innerHTML = "哈哈"
            },
            //掛載完成(模板已經(jīng)成功渲染序目,并且已經(jīng)將模板內(nèi)容掛載到了頁面)
            mounted() {
                console.log('-----------------mounted------------------');
                // 這個(gè)生命周期函數(shù)臂痕,通常用于對(duì)DOM的重新改動(dòng)
                console.log(this.$el);
                // document.querySelector('#name').innerHTML = "呵呵"
            },
            //修改之前(數(shù)據(jù)已經(jīng)改了伯襟,只是還沒有重新掛載頁面)
            beforeUpdate() {
                console.log('-----------------beforeUpdate------------------');
                console.log(this.name+' '+this.age);
                console.log(this.$el);
            },
            //修改完成(數(shù)據(jù)已經(jīng)改了猿涨,頁面也已經(jīng)重新掛載)
            updated() {
                console.log('-----------------updated------------------');
                console.log(this.name+' '+this.age);
                console.log(this.$el);
            },
            //銷毀之前
            beforeDestroy() {
                console.log('-----------------beforeDestroy------------------');
                // 這個(gè)生命周期函數(shù),會(huì)用的多一些
                console.log(this);
                // 對(duì)數(shù)據(jù)做任何的修改姆怪,都不會(huì)重新渲染到頁面
                this.name = '王五'
            },
            //銷毀完成
            destroyed() {
                console.log('-----------------destroyed------------------');
                // 這個(gè)生命周期函數(shù)叛赚,幾乎不用
                console.log(this);
                this.name = '王五'
            },
        })

        setTimeout(() => {
            // 通過vue實(shí)例的$mount方法,手動(dòng)掛載容器
            // 公共el選項(xiàng)指定掛載容器稽揭,當(dāng)模板渲染成功后俺附,會(huì)離開掛載頁面
            // $mount方法的好處是,可以自行選擇掛載的時(shí)機(jī)溪掀。
            vm.$mount('#app')
        }, 1000);
    </script>

Vue實(shí)例有一個(gè)完整的生命周期事镣,也就是說從開始創(chuàng)建、初始化數(shù)據(jù)揪胃、編譯模板璃哟、掛在DOM、渲染-更新-渲染喊递、卸載等一系列過程随闪,我們成為Vue 實(shí)例的生命周期,鉤子就是在某個(gè)階段給你一個(gè)做某些處理的機(jī)會(huì)骚勘。

vue生命周期.jpg
QQ截圖20211202091538.jpg

beforeCreate( 創(chuàng)建前 )

在實(shí)例初始化之后铐伴,數(shù)據(jù)觀測(cè)和事件配置之前被調(diào)用,此時(shí)組件的選項(xiàng)對(duì)象還未創(chuàng)建俏讹,el 和 data 并未初始化当宴,因此無法訪問methods, data泽疆, computed等上的方法和數(shù)據(jù)户矢。

created ( 創(chuàng)建后 )

實(shí)例已經(jīng)創(chuàng)建完成之后被調(diào)用,在這一步于微,實(shí)例已完成以下配置:數(shù)據(jù)觀測(cè)逗嫡、屬性和方法的運(yùn)算青自,watch/event事件回調(diào),完成了data 數(shù)據(jù)的初始化驱证,el沒有延窜。 然而,掛在階段還沒有開始, $el屬性目前不可見抹锄,這是一個(gè)常用的生命周期逆瑞,因?yàn)槟憧梢哉{(diào)用methods中的方法,改變data中的數(shù)據(jù)伙单,并且修改可以通過vue的響應(yīng)式綁定體現(xiàn)在頁面上获高,,獲取computed中的計(jì)算屬性等等吻育,通常我們可以在這里對(duì)實(shí)例進(jìn)行預(yù)處理念秧,也有一些童鞋喜歡在這里發(fā)ajax請(qǐng)求,值得注意的是布疼,這個(gè)周期中是沒有什么方法來對(duì)實(shí)例化過程進(jìn)行攔截的摊趾,因此假如有某些數(shù)據(jù)必須獲取才允許進(jìn)入頁面的話,并不適合在這個(gè)方法發(fā)請(qǐng)求游两,建議在組件路由鉤子beforeRouteEnter中完成

beforeMount

掛在開始之前被調(diào)用砾层,相關(guān)的render函數(shù)首次被調(diào)用(虛擬DOM),實(shí)例已完成以下的配置: 編譯模板贱案,把data里面的數(shù)據(jù)和模板生成html肛炮,完成了el和data 初始化,注意此時(shí)還沒有掛在html到頁面上宝踪。

mounted

掛在完成侨糟,也就是模板中的HTML渲染到HTML頁面中,此時(shí)一般可以做一些ajax操作肴沫,mounted只會(huì)執(zhí)行一次粟害。

beforeUpdate
在數(shù)據(jù)更新之前被調(diào)用,發(fā)生在虛擬DOM重新渲染和打補(bǔ)丁之前颤芬,可以在該鉤子中進(jìn)一步地更改狀態(tài)悲幅,不會(huì)觸發(fā)附加地重渲染過程

updated(更新后)

在由于數(shù)據(jù)更改導(dǎo)致地虛擬DOM重新渲染和打補(bǔ)丁只會(huì)調(diào)用,調(diào)用時(shí)站蝠,組件DOM已經(jīng)更新汰具,所以可以執(zhí)行依賴于DOM的操作,然后在大多是情況下菱魔,應(yīng)該避免在此期間更改狀態(tài)留荔,因?yàn)檫@可能會(huì)導(dǎo)致更新無限循環(huán),該鉤子在服務(wù)器端渲染期間不被調(diào)用

beforeDestroy(銷毀前)

在實(shí)例銷毀之前調(diào)用,實(shí)例仍然完全可用聚蝶,

這一步還可以用this來獲取實(shí)例杰妓,
一般在這一步做一些重置的操作,比如清除掉組件中的定時(shí)器 和 監(jiān)聽的dom事件
destroyed(銷毀后)
在實(shí)例銷毀之后調(diào)用碘勉,調(diào)用后巷挥,所以的事件監(jiān)聽器會(huì)被移出,所有的子實(shí)例也會(huì)被銷毀验靡,該鉤子在服務(wù)器端渲染期間不被調(diào)用

三倍宾、輪播圖例子

樣式

  <style>
        #app {
            position: relative;
            width: 750px;
        }

        #app img {
            width: 100%;
        }

        .jiantou {
            width: 50px;
            height: 50px;
            background-color: rgba(0, 0, 0, 0.50);
            position: absolute;
            top: 0;
            bottom: 0;
            margin: auto 0;
            font-size: 30px;
            text-align: center;
            line-height: 50px;
            color: white;
            cursor: pointer;
        }

        .left {
            left: 10px;
        }

        .right {
            right: 10px;
        }
    </style>

頁面

<body>
    <div id="app" @mouseenter="mouseenter" @mouseleave="mouseleave">
        <img :src="imgs[showActive]">
        <div class="left jiantou" @click="left">←</div>
        <div class="right jiantou" @click="right">→</div>
        <button @click="destroy">終止播放</button>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.js"></script>
    <script>
        Vue.config.productionTip = false
        new Vue({
            el: '#app',
            data: {
                //定義定時(shí)器
                timer: null,
                //顯示的下標(biāo)
                showActive: 0,
                //圖片數(shù)組
                imgs: ["http://p1.music.126.net/7zAkp74zoKd0LuEuEP6dOg==/109951166645160829.jpg?imageView&quality=89",
                    "http://p1.music.126.net/pkXsmqmFQOehNkJYmehkng==/109951166646695577.jpg?imageView&quality=89",
                    "http://p1.music.126.net/c1olbeIgiVsj9I39fCUXkQ==/109951166644891380.jpg?imageView&quality=89",
                    "http://p1.music.126.net/JMYet32O1mi6-YZ1GGSYcQ==/109951166646419732.jpg?imageView&quality=89",
                    "http://p1.music.126.net/WCX5Cq1z17Du2z0QBEcEaA==/109951166645933077.jpg?imageView&quality=89"]
            },
            methods: {
                left() {
                    this.showActive--
                    //如果下標(biāo)越界,重新從0開始
                    if (this.showActive < 0) this.showActive = 4
                },
                right() {
                    this.showActive++
                    //如果下標(biāo)越界胜嗓,重新從0開始
                    if (this.showActive >= 5) this.showActive = 0
                },
                mouseenter() {
                    clearInterval(this.timer)
                },
                mouseleave() {
                    //開啟定時(shí)器
                    this.run()
                },
                run() {
                    this.timer = setInterval(() => {
                        console.log(11);
                        this.showActive++
                        //如果下標(biāo)越界高职,重新從0開始
                        if (this.showActive >= 5) this.showActive = 0
                    }, 1000);
                },
                destroy(){
                    this.$destroy()
                }
            },
            //生命周期函數(shù)(表示頁面掛載完成)
            mounted() {
                //開啟定時(shí)器
                this.run()
            },
            // 在這個(gè)生命周期函數(shù)中,清除定時(shí)器
            beforeDestroy() {
                clearInterval(this.timer)
            },
        })
    </script>
</body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辞州,一起剝皮案震驚了整個(gè)濱河市怔锌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孙技,老刑警劉巖产禾,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牵啦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妄痪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哈雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衫生,你說我怎么就攤上這事裳瘪。” “怎么了罪针?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵彭羹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泪酱,道長(zhǎng)派殷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任墓阀,我火速辦了婚禮毡惜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斯撮。我一直安慰自己经伙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布勿锅。 她就那樣靜靜地躺著帕膜,像睡著了一般枣氧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垮刹,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天作瞄,我揣著相機(jī)與錄音,去河邊找鬼危纫。 笑死宗挥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的种蝶。 我是一名探鬼主播契耿,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼螃征!你這毒婦竟也來了搪桂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤盯滚,失蹤者是張志新(化名)和其女友劉穎踢械,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魄藕,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡内列,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了背率。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片话瞧。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖寝姿,靈堂內(nèi)的尸體忽然破棺而出交排,到底是詐尸還是另有隱情,我是刑警寧澤饵筑,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布埃篓,位于F島的核電站,受9級(jí)特大地震影響根资,放射性物質(zhì)發(fā)生泄漏架专。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一嫂冻、第九天 我趴在偏房一處隱蔽的房頂上張望胶征。 院中可真熱鬧,春花似錦桨仿、人聲如沸睛低。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱雷。三九已至骂铁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罩抗,已是汗流浹背拉庵。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留套蒂,地道東北人钞支。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像操刀,于是被迫代替她去往敵國和親烁挟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容