Vue常見選項和屬性

Vue選項

1. 數據選項

Vue在聲明組件時,如果使用了對象類型的data選項,模板將找不到data中被聲明的數據。如果使用了支持Vue模板的語法檢器,將得到錯誤的提示“data property in component must be a function”。

2. 屬性選項

Vue爲組件開發提供了屬性(props)選項,我們可以使用它爲組件註冊動態屬性,來處理業務之間的差異性,
使代碼可以複用相似的應用場景。

props選項可以是數組或者對象類型,用於接收從父組件傳遞過來的參數,並允許爲其賦默認值、類型檢查和跪着校驗等。

示例代碼如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>屬性選項</title>
    </head>
    <body>
    <div id="app">
        <color-text text="Hello World"></color-text>
        <br>
        <color-text></color-text>
        <br>
        <color-text color="#f78" text="Hello World"></color-text>
        <br>
        <color-text color="#43gh" text="Hello World"></color-text>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
    <script type="text/javascript">
        Vue.component('color-text',{
            props:{
                text:String,
                color:{
                    type:String,
                    default:'#000',     //默認顏色
                    required:true,
                    validator (value) {     //校驗規則,判斷顏色是否合法
                        return /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/.test(value);
                    }
                }
            },
            template:'<span :style="{color:color}">{{text}}</span>'
        });
        let app = new Vue({
            el:"#app"
        });
    </script>
    </body>
    </html>

3. 方法選項

代碼示例如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>方法選項</title>
    </head>
    <body>
    <div id="app">
    
    </div>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
    <script type="text/javascript">
        let test1 ={
            msg:'Hello World',
            fun1:function () {
                console.log('-------普通函數-----',this);
                console.log(this.msg);
            }
        }
        test1.fun1();
        let test2 ={
            msg:'Hello World',
            fun2: ()=> {
                console.log('-------箭頭函數-----',this);
                console.log(this.msg);
            }
        }
        test2.fun2();
        let app = new Vue({
            el:"#app",
        });
    </script>
    </body>
    </html>

使用箭頭函數定義方法時並不會創建函數作用域,因此this也不會指向其父級實例,此時的this會向上追蹤。當找到某個函數作用域時
this將指向該函數的父級實例,否則this將指向瀏覽器的內置對象Windows。

4. 計算屬性

計算屬性(computed選項)目的在於減輕模板上的業務負擔,當數據鏈上出現衍生數據時,我們可以利用它去維護使用。

示例代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>計算屬性</title>
</head>
<body>
<div id="app" style="font-family: Roboto,sans-serif;color: #45c0ff;margin-left: 100px">
    <h2>英語中的“互文”</h2>
    <p>案例:</p>
    <p>{{message}}.&nbsp;&nbsp;我看到的是車還是貓。</p>
    <p>{{noSpaceMsg}}</p>
    <p>{{palindromeMsg}}</p>
    <p>英語中也有“互文”的修辭手法,比如{{message}}這句話,</p>
    <p>將句中空格去掉可得 {{noSpaceMsg}},</p>
    <p>將句中空格去掉並將其倒序可得 {{palindromeMsg}}。</p>
    <p>可看到,{{noSpaceMsg}} == {{palindromeMsg}}</p>。
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script type="text/javascript">
    let app = new Vue({
        el:"#app",
        data(){
            return{
                message:'WAS IT A CAT OR A CAT I SAW'
            }
        },
        computed:{
            noSpaceMsg(){
                return this.message.replace(/\s/g,'')
            },
            palindromeMsg(){
                return this.message.replace(/\s/g,'').split('').reverse().join('');
            }
        }
    });
</script>
</body>
</html>

使用了computed之後,組件的代碼結構明顯清晰了許多,而且即使日後數據的數據處理方式發生了變化,也只需要在選項中修改即可,
與methods一樣,computed不能以箭頭函數聲明,同時它也會被混入Vue實例,並可通過this調用。

由於計算屬性依賴於響應式屬性,所以當且僅當響應式屬性變化時,計算屬性纔會被重新計算,因此相比於使用methods函數求值,這種求值的效率更高。

5. 偵聽屬性

Vue可以使用偵聽屬性(watch屬性)爲實例添加被觀察對象,並在對象被修改時調用開發者自定義的方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>偵聽屬性</title>
</head>
<body>
<div id="app">
    <h2>數據變化之前
        <i style="color: gray;font-size: 14px;">
            * 指令v-once可以限制視圖不在響應數據變化
        </i>
    </h2>
    <p v-once>{{message}}</p>
    <p v-once>{{noSpaceMsg}}</p>
    <h2>數據變化之後</h2>
    <p>{{message}}</p>
    <p>{{noSpaceMsg}}</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>
    let app = new Vue({
        el:"#app",
        data(){
            return{
                message:'人有悲歡離合, 月有陰晴圓缺。',
                noSpaceMsg:'',
                remoteMsg:'',
                msg:{
                    sender:'aaa',
                    receiver:'bbb'
                }
            }
        },
        methods:{
            loginLine(){
                console.log('----------------------');
            },
            loginMsg(newValue,oldValue){
                console.log(newValue);
            }
        },
        /*
        watch:{
            message (newValue,oldValue){
                this.noSpaceMsg = this.message.replace(/\s/g,'');
            }
        }*/
        //異步修改數據
        /*
        watch:{
            message (newValue,oldValue){
                axios({     //發送ajax異步請求
                    method:'GET',
                    url:'/demo',
                    params:{
                        message:newValue
                    }
                }).then(res =>{
                    this.remoteMsg = res.data.message //接收響應後異步修改數據值
                })
            }
        }*/
        //聲明式watch
        watch:{
            msg:{
                handler:'logMsg',        //方法名
                deep:true,               //深度觀察:對任何數據發生變化,watch方法都會被觸發
                immediate:true         //立即調用:在偵聽開始時立即調用一次watch方法
            },
            'msg.sender':['logMsg','logLine']   //數組方式,可調用多個方法
        }
    });
</script>
</body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章