Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 久久在线一区,久久精品视频在线播放,x8x8国产精品视频

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          子父雙表樹(shù)型grid組件javascript源碼

          子父雙表樹(shù)型grid組件javascript源碼

          父雙表樹(shù)型grid組件javascript源碼, 拿走不謝~

          先看pc端demo(下載后獲得組件源碼和使用API)

          http://kgo-js.com/htmls/twintreegridsample.html

          vue搭建項(xiàng)目的時(shí)候,會(huì)有父組件和子組件,你有沒(méi)有思考一下當(dāng)我想要得到父組件或者子組件的數(shù)據(jù)時(shí),該怎么實(shí)現(xiàn)父組件和子組件之間的通訊呢?如果知道的話,那太nice啦,不太清楚的話那就往下看吧~ 正文 我們通過(guò)實(shí)現(xiàn)下面的小demo來(lái)介紹父組件和子組件之間的通訊吧~

          添加圖片注釋,不超過(guò) 140 字(可選)

          父組件傳子組件

          兩種方式:

          添加圖片注釋,不超過(guò) 140 字(可選)

          父組件中存放列表數(shù)據(jù)和input,子組件來(lái)實(shí)現(xiàn)渲染列表,傳列表給子組件

          • 父組件通過(guò):list="list"list傳給子組件
           <Child :list="list"></Child>

          子組件通過(guò)defineProps接收父組件傳入的list

          defineProps({
            list: {
                type: Array,
                default: ()=> [] // 默認(rèn)值
            }
          });

          App.vue

          <template>
            <div class="input-group">
              <input type="text" v-model="value">
              <button @click="add">添加</button>
            </div>
          
            <Child :list="list"></Child>
          </template>
          <script setup>
          import Child from '@/components/child.vue';
          import { ref } from 'vue';
          
          const list=ref(['html', 'css', 'js']);
          const value=ref('');
          
          const add=()=> {
            list.value.push(value.value);
            value.value='';
          }
          </script>
          
          <style lang="css" scoped>
          
          </style>

          child.vue

          <template>
            <div class="child">
            <ul>
              <li v-for="(item, index) in list" :key="index">{{ item }}</li>
            </ul>
          </div>
          </template>
          
          <script setup>
          import { defineProps } from 'vue';
          
          defineProps({
            list: {
                type: Array,
                default: ()=> [] // 默認(rèn)值
            }
          });
          </script>
          
          <style lang="css" scoped>
          
          </style>

          父組件存放input,子組件放列表并實(shí)現(xiàn)渲染,父組件傳input內(nèi)的值給子組件

          • 父組件通過(guò)定義一個(gè)變量toChild,將value賦值給toChild
          • 通過(guò):msg="toChild"toChildmsg傳遞給子組件
            <Child :msg="toChild"></Child>

          子組件通過(guò) defineProps接收msg

          const props=defineProps({
            msg:''
          }); 

          通過(guò)watch來(lái)監(jiān)聽(tīng)msg,對(duì)列表數(shù)據(jù)進(jìn)行更新

          watch(
            ()=> props.msg,
            (newValue, oldValue)=> {
              list.value.push(newValue);
            }
          );

          App.vue

          <template>
            <div class="input-group">
              <input type="text" v-model="value">
              <button @click="add">添加</button>
            </div>
          
            <Child :msg="toChild"></Child>
          </template>
          <script setup>
          import Child from '@/components/child.vue';
          import { ref } from 'vue';
          
          const list=ref(['html', 'css', 'js']);
          const value=ref('');
          const toChild=ref('');
          
          const add=()=> {
            toChild.value=value.value;
          }
          
          </script>
          
          <style lang="css" scoped>
          
          </style>

          child.vue

          <template>
            <div class="child">
            <ul>
              <li v-for="(item, index) in list" :key="index">{{ item }}</li>
            </ul>
          </div>
          </template>
          
          <script setup>
          import {ref, watch} from 'vue';
          
          const list=ref(['html', 'css', 'js']);
          const props=defineProps({
            msg:''
          });
          
          watch(
            ()=> props.msg,
            (newValue, oldValue)=> {
              list.value.push(newValue);
            }
          );
          </script>
          
          <style lang="css" scoped>
          
          </style>

          子組件傳父組件

          子組件中存放input,父組件中存放數(shù)據(jù)清單并渲染數(shù)據(jù)

          添加圖片注釋,不超過(guò) 140 字(可選)

          第一種方法

          • 子組件創(chuàng)建一個(gè)add1事件
          const emits=defineEmits(['add1']); // 創(chuàng)建一個(gè)add事件

          子組件在add函數(shù)中發(fā)布事件,并傳入數(shù)據(jù)value

          const add=()=> {
            // 將value給到父組件
          emits('add1', value.value);// 發(fā)布事件
          } 

          在父組件中訂閱事件add1

           <Child @add1="handle"></Child> 

          當(dāng)觸發(fā)add1事件時(shí),也就是點(diǎn)擊增加時(shí)觸發(fā)handle函數(shù)

          const handle=(event)=> {
              list.value.push(event);
            }

          App.vue

          <template>
              <!-- 訂閱add1事件 -->
              <Child @add1="handle"></Child>
          
              <div class="child">
                  <ul>
                      <li v-for="(item, index) in list" :key="index">{{ item }}</li>
                  </ul>
              </div>
            </template>
            <script setup>
            import Child from '@/components/child2.vue';
            import { ref } from 'vue';
            
            const list=ref(['html', 'css', 'js']);
          
            const handle=(event)=> {
              list.value.push(event);
            }
           
            </script>
            
            <style lang="css" scoped>
            
            </style>

          child.vue

          <template>
              <div class="input-group">
                <input type="text" v-model="value">
                <button @click="add">添加</button>
              </div>
          </template>
          
          <script setup>
          import { ref } from 'vue';
          
          const value=ref('');
          const emits=defineEmits(['add1']); // 創(chuàng)建一個(gè)add事件
          
          const add=()=> {
            // 將value給到父組件
          emits('add1', value.value);// 發(fā)布事件
          }
          </script>
          
          <style lang="css" scoped>
          
          </style>

          第二種方法

          • 父組件通過(guò) v-model:list="list"將list傳給子組件
           <Child v-model:list="list"></Child>

          子組件通過(guò)props接收list

          const props=defineProps({
            list:{
              type: Array,
              default: ()=> []
            }
          }); 

          子組件可以直接在add函數(shù)通過(guò)props.list.push(value.value);來(lái)實(shí)現(xiàn)對(duì)列表數(shù)據(jù)的更新,但是不太建議這種方法,不太建議直接操作父組件給過(guò)來(lái)的數(shù)據(jù),這樣的話代碼的可維護(hù)性比較差 子組件通過(guò)使用defineEmits來(lái)新建一個(gè)emits函數(shù),該函數(shù)用于告知父組件,子組件希望更新一個(gè)名為 list 的數(shù)據(jù),再新建一個(gè)變量arr來(lái)接收list,來(lái)更新arr,再通過(guò)emits('update:list', arr);來(lái)實(shí)現(xiàn)對(duì)list的更新

          const emits=defineEmits(['update:list']);
          
          const add=()=> {
          const arr=props.list;
          arr.push(value.value);
          emits('update:list', arr);
          }

          App.vue

          <template>
              <Child v-model:list="list"></Child>
          
              <div class="child">
                  <ul>
                      <li v-for="(item, index) in list" :key="index">{{ item }}</li>
                  </ul>
              </div>
            </template>
            <script setup>
            import Child from '@/components/child3.vue';
            import { ref } from 'vue';
            
            const list=ref(['html', 'css', 'js']);
          
            
            </script>
            
            <style lang="css" scoped>
            
            </style>

          child.vue

          <template>
              <div class="input-group">
                <input type="text" v-model="value">
                <button @click="add">添加</button>
              </div>
          </template>
          
          <script setup>
          import { ref } from 'vue';
          
          const value=ref('');
          const props=defineProps({
            list:{
              type: Array,
              default: ()=> []
            }
          });
          const emits=defineEmits(['update:list']);
          
          const add=()=> {
          // props.list.push(value.value);// 不建議直接操作父組件給過(guò)來(lái)的數(shù)據(jù)
          
          const arr=props.list;
          arr.push(value.value);
          emits('update:list', arr);
          }
          </script>
          
          <style lang="css" scoped>
          
          </style>

          第三種方法

          將列表數(shù)據(jù)存放在子組件中:

          • 子組件通過(guò)defineExpose({list});list暴露出來(lái)
          • 父組件通過(guò)ref="childRef"賦予了一個(gè)名字為childRef的引用
           <Child ref="childRef"></Child>
          • 父組件通過(guò) const childRef=ref(null);創(chuàng)建一個(gè)響應(yīng)式的引用(ref)對(duì)象childRef
          • 通過(guò)(item, index) in childRef?.list來(lái)遍歷列表數(shù)據(jù)
           <div class="child">
                  <ul>
                      <li v-for="(item, index) in childRef?.list" :key="index">{{ item }}</li>
                  </ul>
              </div>

          -childRef?.list 這是一種安全訪問(wèn)屬性的方式,避免了嘗試訪問(wèn)undefinednull對(duì)象的屬性時(shí)拋出錯(cuò)誤,也就是只有當(dāng)childRef不為nullundefined時(shí),才會(huì)嘗試訪問(wèn)其list屬性,因?yàn)榇藭r(shí)子組件可能尚未被創(chuàng)建或掛載,直接訪問(wèn)childRef.list會(huì)導(dǎo)致錯(cuò)誤,因?yàn)?/span>nullundefined沒(méi)有list屬性 App.vue

          <template>
              <Child ref="childRef"></Child>
          
              <div class="child">
                  <ul>
                      <li v-for="(item, index) in childRef?.list" :key="index">{{ item }}</li>
                  </ul>
              </div>
            </template>
            <script setup>
            import Child from '@/components/child4.vue';
            import { ref } from 'vue';
            
            const childRef=ref(null);
          </script>
            
            <style lang="css" scoped>
            
            </style>

          child.vue

          <template>
              <div class="input-group">
                <input type="text" v-model="value">
                <button @click="add">添加</button>
              </div>
          </template>
          
          <script setup>
          import { ref } from 'vue';
          
          const value=ref('');
          const list=ref(['html', 'css', 'js']);
          
          const add=()=> {
          list.value.push(value.value);
          }
          
          defineExpose({list});//==> defineExpose({list: list}); 心甘情愿暴露出list
          </script>
          
          <style lang="css" scoped>
          
          </style>

          結(jié)語(yǔ)

          1. 父子組件通訊 --- 父組件用v-bind綁定傳給子組件,子組件用defineProps接收數(shù)據(jù)
          2. 子父組件通訊 --- 子組件用defineEmits創(chuàng)建一個(gè)事件,在發(fā)布該事件時(shí)傳入數(shù)據(jù),父組件通過(guò)v-on來(lái)訂閱該事件
          3. 子父組件通訊 --- 父組件借助v-model將數(shù)據(jù)綁定給子組件,子組件創(chuàng)建'update:xxx'事件,并將接收到的數(shù)據(jù)修改后emits出來(lái)
          4. 子父組件通訊 --- 父組件通過(guò)ref獲取子組件中的defineExpose()暴露出來(lái)的數(shù)據(jù)

          2第一章筆記

          11盒子模型

          1. border-style:solid(實(shí)線)/dashed(虛線)/dotted(點(diǎn)劃線)/double(雙線)

          2. padding 內(nèi)容區(qū)域距離邊框

          3. padding會(huì)撐開(kāi)原有盒子的寬、高所以我們要減去padding的長(zhǎng)度

          4. padding的屬性值4種方式:上 右 下 左、上 左右 下、上下 左右、 一個(gè)值四個(gè)方向(可以單獨(dú)設(shè)置某一邊)

          5. 如果出現(xiàn)邊框塌陷那么:overflow:hidden;

          12盒子模型

          1. margin 塊與塊之間的位置

          2. margin: 0 auto

          3. margin-top;設(shè)置時(shí),如果子父都設(shè)置了margin,子的margin會(huì)傳遞到父的margin,例如:

          解決方法:在父元素加入:overflow:hidden;

          4. margin與padding

          1. margin框架與框架之間、塊與塊之間、盒子與盒子、

          2. padding盒子內(nèi)部

          13文本溢出

          1. 語(yǔ)法{overflow:visible/hidden/scroll/auto/inherit;}

          說(shuō)明:

          visible:默認(rèn)值,內(nèi)容不會(huì)被修剪,會(huì)出現(xiàn)在元素框之外。

          hidden:內(nèi)容會(huì)被修剪,并且其余內(nèi)容是不可見(jiàn)的;

          sorcll:內(nèi)容會(huì)被修剪,但瀏覽器會(huì)顯示滾動(dòng)條,以便查看其余的內(nèi)容;

          auto:如果內(nèi)容被修剪,則瀏覽器會(huì)顯示滾動(dòng)條,以便看見(jiàn)其他的內(nèi)容;

          inherit:規(guī)定應(yīng)該從父元素繼承overflow屬性的值。

          2. 語(yǔ)法{white-space:normal/pre/nowrap/pre-wrap/pre-line/inherit;}

          normal:默認(rèn)。空白會(huì)被瀏覽器忽略。

          pre:空白會(huì)被瀏覽器保留。

          nowrap:文本不會(huì)換行,文本會(huì)在在同一行上繼續(xù),直到遇到<br>標(biāo)簽為止。

          pre-wrap:保留空白符序列,但是正常的進(jìn)行換行

          pre-line:合并空白符序列,但保留換行符。

          inherit:規(guī)定應(yīng)該從父元素繼承white-space屬性的值。

          14文本溢出

          1. 語(yǔ)法{text-overflow:clip/ellipsis;}

          clip:不顯示省略號(hào),而是簡(jiǎn)單的裁剪。

          ellipsis:當(dāng)對(duì)象內(nèi)文本沒(méi)有溢出時(shí),顯示省略標(biāo)記。

          2. 使用ellipsis時(shí)需要配合下面:

          width:10px;容器的寬,

          white-space:nowrap;強(qiáng)制文本在一行內(nèi)顯示,

          overflow:hidden; 溢出內(nèi)容為隱藏,

          text-overflow:ellipsis; 溢出文本顯示省略號(hào),


          主站蜘蛛池模板: asmr国产一区在线| 波多野结衣AV一区二区三区中文| 精品成人一区二区三区免费视频| 中文字幕一区二区免费| 日韩动漫av在线播放一区| 国产视频福利一区| 久久精品国产第一区二区三区| 亚洲欧洲∨国产一区二区三区| 亚洲国产精品一区二区第一页免| 精品国产日韩亚洲一区在线| 欧美一区内射最近更新| 麻豆一区二区三区精品视频| 日韩人妻一区二区三区蜜桃视频 | 中文字幕无线码一区| 免费一区二区视频| 在线观看视频一区二区| 亚洲一区二区无码偷拍| 亚洲AV无码一区二区乱子仑| 亚洲日韩国产欧美一区二区三区| 亚洲视频一区二区三区四区| 亚洲变态另类一区二区三区 | 视频一区二区精品的福利| 国产成人欧美一区二区三区| 精品国产日韩亚洲一区在线| 国产一区二区福利久久| 超清无码一区二区三区| 亚洲AV综合色区无码一区| 日本内射精品一区二区视频| 麻豆AV一区二区三区| 国产伦精品一区二区三区不卡 | 老熟女高潮一区二区三区| 日本在线视频一区二区| 国产精品va一区二区三区| 亚洲国产一区视频| 无码少妇一区二区性色AV| 亚洲av无码成人影院一区| 国产成人久久一区二区三区| 久久亚洲中文字幕精品一区四| 国产高清视频一区三区| 在线观看中文字幕一区| 爆乳熟妇一区二区三区霸乳|