天天看點

《若依ruoyi》第四十七章:若依RuoYi-App view和template标簽

作者:源碼解析
本章節講解一下uniapp開發的基本元件

一、視圖容器之一view

<template>
    <div>
        <h2>詳情頁</h2>
        <view>我是一個大盒子</view>
    </div>
</template>

<script>
    export default{
    }
</script>

<style scoped>
    
</style>
           

<view>元件就相當于我們html容器中的<div>

view中有哪些屬性:

《若依ruoyi》第四十七章:若依RuoYi-App view和template标簽

二、template标簽

Vue模闆的主要特點

  1. 使用XML文法
  2. 使用{{}}插入表達式,隻能包含單個表達式
  3. 使用v-html v-on v-bind 等指令操作DOM
  4. 使用v-if v-for等指令實作條件判斷和循環

模闆template三種寫法

一、Vue完整版,寫在HTML裡

// html檔案
<div id=xxx>
{{n}}
<button @click="add">+1</button>
</div>
           

二、Vue完整版,寫在選項裡

<div id="app"></div>

new Vue({
    template: `
        <div>
            {{n}}
            <button @click="add">+1</button>
        </div>`,
    data:{n:0}, // data
    methods:{add(){ this.n += 1 }}
}).$mount('#app')
           

注意:div#app 會被取代

三、Vue非完整版,配合xxx.vue檔案

// xxx.vue
<template>
    <div>
      {{n}}
      <button @click="add">+1</button>
    </div>
</template>
<script>
    export default {
        data(){ return {n:0} },     // data 必須為函數
        methods:{add(){ this.n += 1 }}
   }
</script>
<style>這裡寫 CSS </style>


// js檔案
import Xxx from './xxx.vue'
new Vue({
    render: h => h(Xxx)
}).$mount('#app')
           

注意:這裡的template裡面的不是html文法,而是xml文法

html和xml的兩個差別:

  1. html:<input name="username">| <input name="username" />兩種寫法都可以,xml 隻能寫 <input name="username" />
  2. html寫空的标簽:<div></div>,xml <div></div>、<div />兩種都可以

展示内容

1、v-text——表達式

{{object.a}}  表達式
{{ n+1 }}    可以寫任何運算
{{ fn(n) }}   可以調用函數
如果值為undefined 或 null 就不顯示
另一種寫法是 <div v-text="表達式"></div>  很少用           

2、v-html——HTML内容

假設 data.x 值為 <strong>hi</strong>
<div v-html="x"></div> 就可以顯示粗體的hi           

使用v-html動态渲染的任意 HTML 可能會非常危險,因為它很容易導緻XSS 攻擊。隻對可信内容使用 HTML 插值,絕不要對使用者提供的内容使用插值。

3、v-pre——展示 {{ n }} ,兩對花括号都展示出來

<div v-pre>{{ n }}</div>
// v-pre 不會對模闆進行編譯           

綁定屬性

v-bind

// 綁定src
<img v-bind:src="x" />

// 簡寫成
<img :src="x" />

// 綁定對象
<div :style="{width: 100}"></div>
// 注意這裡100預設是100px,不寫px也可以,如果是em,就需要寫上'100em'           

綁定事件

v-on

<button v-on:click="add">+1</button>
// 點選之後,Vue會運作 add()

<button v-on:click="xxx(1)">xxx</button>
// 點選之後,Vue會運作 xxx(1)

<button v-on:click="n+=1">xxx</button>
// 點選之後,Vue會運作 n+=1           

縮寫:<button @click="n+=1">xxx</button>,正常人都用縮寫

條件判斷

v-if、v-else-if、v-else

<div v-if="x > 0"> x 大于 0 </div>
<div v-else-if="x === 0"> x 等于 0 </div>
<div v-else="x < 0"> x 小于 0 </div>           

循環

for(value, key) in 對象或數組

// 數組
<ul>
    <li v-for="(u, index) in users" :key="index">
        索引: {{index}} 值:{{u.name}}
    </li>
</ul>

// 對象
<ul>
    <li v-for="(value, name) in obj" :key="name">
        屬性名: {{name}} 屬性值:{{value}}
    </li>
</ul>           

:key="index"有bug,後面補充

顯示、隐藏

v-show

<div v-show="n % 2 === 0">n是偶數</div>           

近似等于

<div :style="{display:n%2===0?'block':'none'}"> n是偶數 </div>           

看得見的元素display不隻有block,如table 的 display 為table,li 的 display 為list-item

v-once——優化更新性能

隻渲染元素群組件一次。随後的重新渲染,元素/元件及其所有的子節點将被視為靜态内容并跳過。不能濫用v-once,隻有在一個元件包含大量靜态内容的情況下考慮使用

v-cloak

這個指令保持在元素上直到關聯執行個體結束編譯。和 CSS 規則一起用時,這個指令可以隐藏未編譯的 Mustache 标簽直到執行個體準備完畢。

[v-cloak] {   
  display: none;
}
<div v-cloak>     
  {{ message }} 
</div>           

不會顯示,直到編譯結束。

修飾符

@click.stop="x" 表示阻止事件傳播/冒泡

@click.prevent="x" 表示阻止預設動作

@click.stop.prevent="x" 同時表示兩種意思

其他:

1、v-on:

.{keycode|keyAlias }

.stop

.prevent

.capture .self .once .passive .native

快捷鍵:.ctrl .alt .shift .meta .exact

滑鼠:.left .right .middle

2、v-bind:

.prop

.camel

.sync

3、v-model:

.lazy

.number

.trim

加粗的重點學習

.sync

當需要對一個 prop 進行“雙向綁定”的時候,如下示例

// App.vue
<template>
  <div class="app">
    App.vue 我現在有 {{total}}
    <hr>
    <Child :money="total" v-on:update:money="total = $event"/> // 監聽并更新money
  </div>
</template>

<script>
import Child from "./Child.vue";
export default {
  data() {
    return { total: 10000 };
  },
  components: { Child: Child }
};
</script>
<style>
</style>

// Child.vue
<template>
  <div class="child">
    {{money}}
    <button @click="$emit('update:money', money-100)">  // 對父元件的money賦新值
      <span>花錢</span>
    </button>
  </div>
</template>

<script>
export default {
  props: ["money"]
};
</script>
<style>
</style>           

代碼中 <Child :money="total" v-on:update:money="total = $event"/>

可以簡寫成 <Child :money.sync="total">

注意:v-bind帶有.sync修飾符時,不能和表達式一起使用

上面代碼中的Vue規則:

  1. 元件不能修改prop外部資料
  2. $emit可以觸發事件,并傳參
  3. $event可以擷取$emit的參數
  4. 使用update:xxx的模式

繼續閱讀