一、jsx如何映射DOM

# 一、jsx如何映射DOM

export function createElement(type,config,children)
// type:用于标识节点的类型
// config:以对象形式传入,组件所有的属性都会以键值对的形式存储在config对象中
// children:以对象的形式传入,它记录的是组件标签之间嵌套的内容

React.createElement("ul",{
  // 传入属性键值对
  className:"list",
  // 从第三个入参开始往后,传入的参数都是children
},React.createElement("li",{
  key:"1",
},"1"),React.createElement("li",{
  key:"2"
},"2"))
// 等效于
<ul className="list">
	<li key="1">1	</li>
	<li key="1">1 </li>
</ul>

# 二、子组件 v-model 高阶用发

v2 写法 默认方式 在父级定义 v-model 值

// # far
<child v-model='msg'>
export default {
 data(){
      return{msg:''}
 }
}

child 默认接收父级 v-model 的值在 props 中的 value (默认值 v3 是 modelValue) 绑定 通过默认 input 触发

// # child
<input :value='value' @input="$emit('input',$event.target.value)">
 props:['value']

如果你不想用 input 元素触发,child 通过设置 model 参数指定触发方式

# child
<input :value='value' @input="ipt">
    model: {
    prop: 'value',
        event: 'update:value'//名字随意 这个是约定格式
},
props:['value']
methods:{
    ipt(){
        this.$emit('update:value',$event.target.value)
    }
}

如果你不想用 value 作为默认值 (绑定多个 v-model),通过设置 model 参数指定触发方式

# child
<input :value='msg' @input="ipt">
 model: {
	prop: 'msg',
	event: 'update:msg'//名字随意 这个是约定格式
},
 props:['msg']

 methods:{
 ipt(){
   this.$emit('update:msg',$event.target.value)
  }
 }

# 三、函数式组件

没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法。实际上,它只是一个接受一些 prop 的函数。在这样的场景下, 我们可以将组件标记为 functional,这意味它无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。一个函数式组件就像这样:

Vue.component('my-component', {
  functional: true,
  // Props 是可选的
  props: {
    // ...
  },
  // 为了弥补缺少的实例
  // 提供第二个参数作为上下文
  render: function (createElement, context) {
    // ...
  },
})
//--------------------------
thear: [
  {
    title: '是否超时',
    align: 'center',
    render: (h, params) => {
      return h(
        'div',
        { style: { color: status ? 'red' : '#000' } },
        params.row.status ? '已超时' : '未超时',
      )
    },
  },
]
export default {
  name: 'Column',
  components: {
    expandDom: {
      functional: true,
      props: {
        row: Object,
        render: [Function, String],
        index: Number,
        column: {
          type: Object,
          default: null,
        },
      },
      render: (h, ctx) => {
        const params = {
          row: ctx.props.row,
          index: ctx.props.index,
        }
        if (ctx.props.column) {
          params.column = ctx.props.column
        }
        if (typeof ctx.props.render == 'string') {
          try {
            return util.toFunction(ctx.props.render)(h, params)
          } catch (error) {
            throw error
          }
        }
        return ctx.props.render(h, params)
      },
    },
  },
}

# 四、Vuex

import Vue from 'vue'
import Vuex from 'vuex'
import project from './modules/project'
Vue.use(Vuex)
const store = new Vuex.Store({
  modules: {
    project,
  },
})

export default store

export default {
  namespaced: true,
  state: {
    id: 0,
  },
  getters: {
    year: (state) => state.tabsData[state.id].year,
  },
  mutations: {
    SET_id: (state, val) => {
      state.id = val
    },
  },
  actions : {
    async getDetail({ commit }, data) {
      //发起有ids 审核有businessId
      let results= await ajax();

        commit('SET_id', results);

    }
  };
}

import { createNamespacedHelpers } from 'vuex'
const { mapState, mapMutations, mapActions, mapGetters } = createNamespacedHelpers('dialog')

export default {
  computed: {
    ...mapGetters(['watchTime']),

    ...mapState(['showDialog1']),
  },
  mounted() {
    this.$store.dispatch('income/getDetail', this.$route)
    let id = this.$store.state.income.id
  },
  methods: {
    ...mapMutations(['OPEN_dialog1', 'CLOSE_dialog1', 'CLOSE_dialog2', 'CLOSE_date_dialog']),
  },
}