5.vue和react一起学 (*^_^*)

11 篇文章 0 订阅

条件渲染&循环渲染&表单&状态提升

react

class Demo extends React.Component {
  constructor(prop) {
    super();
    this.state = {content:[], inputVal:"", demo1prop:1}
  }
  componentDidMount(){
    // 模拟请求
    setTimeout(() => {
      this.setState({
        content: [1,2,3,4]
      })
    }, 1000)
  }
  // 条件渲染&循环渲染:条件语句按需渲染,后台无数据则loading,有数据则map循环渲染,vue里的v-if,v-for指令
  // 受控表单input:受控表单input,vue里面的v-model双向数据绑定
  render(){
    const { content, inputVal, demo1prop } = this.state;
    const {children , namedChild } = this.props;
    return content.length?(
     <div>
       <input value = {inputVal} onChange = {(e)=>{this.setState({inputVal:e.target.value})}}></input>
       <div>受控input的value:{ inputVal }</div>
       <div>后台给的内容: {content.map( c => <span key={c}>内容{ c }</span>)}</div>
       <div>children:<div>{children}</div>{namedChild}</div>
       <Demo1 prop={demo1prop} changePropFn={(value) =>{this.setState({demo1prop:value})}}/>
     </div>
    ):(<React.Fragment>loading...</React.Fragment>)
  }
}

// 子组件将自身的状态提升为父组件的状态,并用属性的形式实现传值和通信。对比vue里面的v-model,sync, $emit
function Demo1 (props){
  const {prop, changePropFn} = props;
   return(<div onClick = {()=>{changePropFn(2)}}>
      Demo1内容:{prop}
   </div>)
}

ReactDOM.render(
  // 对比vue里面的this.$slot[name]和this.$slot.default
  <Demo namedChild="i am named child">i am default child</Demo>,
  document.getElementById("app")
);

vue

const Demo = Vue.component("Demo",{
    render(){
        const {content, inputValue} = this;
        // jsx条件以及循环渲染同react。template写法有v-if,v-for语法糖指令。
        // 表单input受控同react,template写法有v-model语法糖。
        // 状态提升,有v-model,sync,$emit,传入prop等多种方式。
        return(
            content
            ?<div>
                <div>内容:{content.map( c => <span key={c}>内容{ c }</span>)}</div>
                <input value = {inputValue}  onChange = {(e)=>{this.inputValue=e.target.value;console.log(1)}}></input>
                <div>受控input: {inputValue}</div>
            </div>
            :<span>loading...</span>
        )
    },
    mounted() {
        setTimeout(() => {
            this.content = [1,2,3,4]
        },1000)
    },
    data(){
        return {
            content:[],
            inputValue:""
        }
    }
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值