baidu / san

A fast, portable, flexible JavaScript component framework
https://baidu.github.io/san/
MIT License
4.72k stars 549 forks source link

关于表单-select的问题 #69

Closed StudentWan closed 7 years ago

StudentWan commented 7 years ago

起初我以为是文档写的有点问题,不过后来发现不是,select中也确实是可以用{==}来实现双向绑定的。

但是在写代码还是还是出现一点问题:

var MyApp = san.defineComponent({
      template: `  
        <select value="{=online=}">
            <option value="errorrik">errorrik</option>
            <option value="otakustay">otakustay</option>
            <option value="firede">firede</option>
        </select>
      `
    });
    var myApp = new MyApp();
    myApp.attach(document.body);

这样写会报错:

san.dev.js:2627 Uncaught TypeError: Cannot read property 'get' of undefined
    at evalExpr (san.dev.js:2627)
    at ComponentClass.Node.evalExpr (san.dev.js:3381)
    at Object.attr (san.dev.js:3710)
    at san.dev.js:3877
    at each (san.dev.js:174)
    at IndexedList.each (san.dev.js:587)
    at genElementStartHTML (san.dev.js:3869)
    at Element.genHTML (san.dev.js:4249)
    at san.dev.js:3949
    at each (san.dev.js:174)

但是<select bind-value="online">或者在select外面套一层根元素如div,结果却是正常的

不是很清楚原因,求指教...

Dafrok commented 7 years ago

组件的根节点只接收从父组件传进来的 prop 吧

leeight commented 7 years ago

感觉像是一个Bug

StudentWan commented 7 years ago

@Dafrok 我大概了解了,就是说这个{==}是从父组件传过来的,就是prop了。

那这样的话,又有一点问题,下面这段代码就不会报错...:

var MyApp = san.defineComponent({
      template: '<input value="{= online =}"></input>'
        }
      }
    });
    var myApp = new MyApp();
    myApp.attach(document.body);

我的理解是不管是select还是input中的online都是父组件prop的data。 为什么一个会出错一个不会呢= = San中不是一定需要初始化数据对象的吧?

Dafrok commented 7 years ago

首先说一下我刚才的结论是错的,并且你也没 get 我的点。我打个比方,之前使用的时候,下面这个 case 中我期望看到一个红字蓝底的 233,但是实际输出只是红字,蓝底没了。

然而,刚刚写了个 case,证明父节点传入的 style 属性只是优先级高而已,如果删掉父节点的 style,233 就会变成蓝底。

const Comp = san.defineComponent({
  template: `<div style="background: blue">23333</div>`
})

const App = san.defineComponent({
  components: {
    comp: Comp
  },
  template: `<div>
    <comp style="color: red"></comp>
  </div>`
})

const app = new App()
app.attach(document.body)
StudentWan commented 7 years ago

@Dafrok 我跑了一下你提供的这个代码,输出的是红字蓝底啊...如果父组件也写了background的话确实会覆盖子组件的样式,不过不是很能理解这个例子跟问题的关联... 不是很能get到点,能讲的再浅显一点吗? 我比较菜...

Dafrok commented 7 years ago

啥?你确定是红底蓝字?你看看这个 case 是啥样子 https://codepen.io/Dafrok/pen/EXvrEQ

Dafrok commented 7 years ago

这个例子和问题没什么关联,只是举例说明我在 2 楼回复的结论是错的而已…………

StudentWan commented 7 years ago

@Dafrok 我不是在Codepen上面跑的: http://danielwan.me/demo/sanstyle.html demo在这里...

StudentWan commented 7 years ago

@Dafrok 所以大佬正确的结论应该是什么呢ORZ

Dafrok commented 7 years ago

结论同 3 楼。。

StudentWan commented 7 years ago

@Dafrok 感谢大佬...

errorrik commented 7 years ago

应该是个bug