Carlos,

Are you saying here having your idea:

"
1) I think people have the APIs (className and classList) and can/will do
what they want, although we say "use className only at init time".
"

If I do following things:

<Component id="comp" className="myClass"/>

And later in the code I do:

comp.className = "myOtherClass";

It won't work?

Piotr


On Sat, Apr 14, 2018, 11:48 AM Carlos Rovira <carlosrov...@apache.org>
wrote:

> Alex
>
> 2018-04-14 8:41 GMT+02:00 Alex Harui <aha...@adobe.com.invalid>:
>
> > Carlos,
> >
> > It seems like either you have missed some of the discussion or maybe we
> > weren't clear enough.
> >
>
> I think most of what you say was considered but let's go for parts:
>
>
> >
> > Simply put:
> > -The Basic components do not need to handle classList APIs.  There is no
> > expectation that classes will be frequently added and removed.
> >
>
> That's ok. Basic no, Jewel yes. That's huge diference, so I think as you
> UIBase should go to Core and be as is now (or make the changes you
> estimate)
>
>
> > -The goal of most component sets in Royale is to abstract away the
> > underlying platform APIs.  That's why I'm not in favor of having a
> > classList API on UIBase.
> >
>
> Right, classList is JS only so maybe an API in JewelUIBase should be
> general and use the JS code with COMPILE::JS
> then implement others.
>
> -MXML is better with space delimited string lists instead of arrays.
> >
>
> I think in you version and my version is a string, but in mine then is
> converted to feed classList
>
>
> > -It doesn't make sense to split strings into an array in JS when the
> > browser clearly can do it.
> > -This perf test shows className is faster [1]
> > -So does this one [2]
> >
> >
> > We are starting from a list of strings.  MDL is not.  And that makes a
> > difference, IMO.
> >
> >
> ok in Jewel we could do in that way, the main difference with Basic is that
> the main task of this kind of set is
> heavily deal with class selectors so for Jewel (not for Basic) we should
> focus on it what means to me be fundamental part of JewelUIBase to have an
> API to deal with styles in all platforms and that all components extending
> it can use.
>
>
> > I forgot to mention earlier that I was not happy that addStyles and
> > friends were JS-only.  It would have been better if it did not take an
> > element since that is a JS platform implementation.  That way application
> > developers could use addStyles and friends to manipulate the set of class
> > selectors at runtime.
> >
>
> ok, that's a fail on my implementation that should be fixed
>
>
> >
> > More comments in-line..
> >
> > [1]
> > https://measurethat.net/Benchmarks/Show/54/0/
> > classname-vs-setattribute-vs-c
> > lasslist
> > [2] https://jsperf.com/classname-vs-classlist-showdown/5
> >
> > On 4/13/18, 7:18 PM, "carlos.rov...@gmail.com on behalf of Carlos
> Rovira"
> > <carlos.rov...@gmail.com on behalf of carlosrov...@apache.org> wrote:
> >
> > >Hi,
> > >
> > >I think the discussion now should center in numbers.
> > >
> > >I added "performance.now()" to typedefs (how could we live without this
> > >until now? :))
> >
> > Snip...
> > >
> > >
> > >I think numbers are near identical right?
> > >
> > >
> > >So given very close numbers should make us choose the more simplest code
> > >
> > >
> > >right?
> > >
> > No.  Small samples are often not useful.  These kinds of arguments are
> the
> > ones that led to UIComponent being 13,000 lines in Flex.
> >
>
> I think here we are talking about performance, not about to increase number
> of lines of code
>
>
> >
> >
> > >
> > >
> > >2018-04-14 2:58 GMT+02:00 Carlos Rovira <carlosrov...@apache.org>:
> > >
> > >> Hi Alex,
> > >>
> > >> just studied you changes and want to ask you a few things:
> > >>
> > >> 1) Why className and classLists methods must remain unsynced? I think
> > >>this
> > >> is not necessary and seems to me a bit unnatural since when I add
> styles
> > >> though classList in a element this makes the internal list changed,
> and
> > >>if
> > >> I then do "trace(element.className)" it will report the updated
> > >>list...so I
> > >> think both are synced by default
> >
> > I proposed a way to have components that want to use classList pay for
> it.
> >  If you want to further penalize those components in order to maintain
> > synchronization of classList and className go ahead as long as it doesn't
> > impact org.apache.flex.core.UIBase.  Yes, the browser keeps className and
> > classList in sync, but you are missing that the emphasized, primary and
> > secondary selectors are not in the className list maintained by UIBase
> and
> > there is additional cost to doing so.
> >
> >
> That's because when I refactored the code when you ask me to do so I tried
> to make it
> className dependent. I think the solution is in JewelUIBase wire all
> through classList.
> we'll have a tiny performance hit, that's right, but I think a uiset with
> the purpose of Jewel
> (theming - styling - goof looking) is the price that have to pay. a little
> less performance than Basic
>
>
>
> >
> > >>
> > >> 2) Now Button has two new methods that must make various operations
> with
> > >> arrays (join, push, splice...), this means in almost all jewel
> > >>components
> > >> override at least computeFinalClassNames and insert new custom methods
> > >>for
> > >> add/toggle/remove and each one will make various operations: in the
> > >>case of
> > >> toggle will do a push or splice and then the normal classList toggle
> > >> operation.
> > >>
> > It is probably possible to package up the code I added to Jewel Button
> and
> > make it re-usable without inserting a base class for all of Jewel.  Or is
> > absolutely every Jewel component going to need that code?  If so, then
> > maybe a common base class for all of Jewel makes sense.
> >
>
> Yes, all components in Jewel is doing/will do heavy use of style API, so is
> a must
> in this set to have that api (while it's not in UIBase and Basic)
>
>
> >
> > Also, the code I added to Jewel Button is can be greatly simplified if
> you
> > assume folks will not directly set className after adding to parent.
> >
>
> No, as MDL, this kind of components are based on heavily add and removal of
> class selectors
> users will pushing buttons, clicking checkboxes, and more, and part of that
> actions will be to add/remove/toggle
> class selectors in one or more components.
>
> That's what MDL does, that what Jewel does, and that's what any actual UI
> set with focus on visuals will do
>
>
> >
> >
> > >> 3) we are introducing a new array property per component to store what
> > >> classList already do
> >
> > No, the array does not have to have as many elements as the classList.
> > >>
> > >> So for me we are introducing lots of complexity, with more code
> splitter
> > >> in every class, each one with more operations of array operations that
> > >> finaly makes the same call I did. And generating complexity since
> > >>className
> > >> should be used by users only at init time and then use the rest of
> > >> classList apis...
> >
> > That's PAYG.  The classes that need it get the additional complexity.
> And
> > again, if we want to restrict setting classname after init in Jewel,
> > that's totally fine with me and will simplify the code.
> >
>
> The classes that need get the additional complexity, but at least we need
> to
> proxy all that in JewelUIBase since *all* Jewel components will use the
> same code
>
>
>
> > >>
> > >> The only difference for me is that you want to avoid the classList
> > >>initial
> > >> add method that in most of the cases will add from 1 or 2 classes and
> > >>up to
> > >> 3-4-5. I think normal components would have 3 on average...
> > >>
> > >> This related to lots of sites saying "use classList instead of
> > >>className"
> > >> and frameworks like MDL that are based only on classList , and all
> > >>jsperfs
> > >> (that although are not reflecting our concrete use case and use of
> > >> classList, I think are completely valid on essence) makes me think
> about
> > >> how we have such different visions.
> > >>
> > >> So I must to say that as much as I want to see the advantages the
> > >> approaches do not convince me...
> > >>
> > >> for me is more simple that all of that.
> > >>
> > >> 1) I think people have the APIs (className and classList) and can/will
> > >>do
> > >> what they want, although we say "use className only at init time".
> >
> > Again, we are abstracting the underlying implementation of how to set
> > class selectors in most Royale component sets.  That way, if we want to
> > target other output we have fewer APIs to reproduce.  We only need to
> > reproduce the conceptual APIs.
> > >>
> > >> 2) I think we should have the most easy way to modify since browsers
> are
> > >> takin care of internal apis performance (or at least I'm confident
> with
> > >> that, like I was confident on flash player performance)
> > >>
> > >> 3) I don't like to introduce lots of code when maybe the basic usage
> of
> > >> classList can be even more efficient. I give various jsperf studies
> out
> > >> there but both Harbs and you didn't show me anyone that shows
> className
> > >>as
> > >> a better option.
> > >>
> > >> 4) If we are introducing such complexity, wouldn't be better to remove
> > >> completely classList and end that code with the new array property and
> > >> array operations? I think it will be more performant and will remove
> > >> complexity.
> > >>
> > >> 5) If I use that solution for jewel, I should introduce some
> > >>intermediate
> > >> class between UIBase and a Jewel Component where I can proxy all that
> > >> methods that are now in button to avoid replicate in all jewel
> > >>components.
> > >> And by doing that, as I said before, I'll prefer to remove that
> > >>complexity
> > >> and go for simple classList manipulation since is the same that MDL
> (to
> > >> name a concrete and successful project that renders and performs
> > >> magnificent) does [1] (I put button example just as an example since
> > >> there's lots more)
> > >>
> > >> Sincerily, I'm not convinced with the results exposed here, and I was
> > >> always thinking that I was not seeing something evident, but now I'm
> > >>even
> > >> more convinced that we should use classList without any rejection.
> Even
> > >>for
> > >> the use of className in MXML, is ok since I proved you can transform
> it
> > >> without problem getting the string, splitting and introducing in the
> > >> classList, and then opertating with is when needed without any
> > >>performance
> > >> significant problem. For me is more problematic all the code we want
> to
> > >> introduce to avoid possible performance problems that I and many
> others
> > >> don't see and that main web projects actually don't see and are used
> all
> > >> over the web. We should not be different in something that other has
> > >> already adopted, and if people is using it, is because the browsers,
> the
> > >> standards and all the web wants all people using it, and for me is
> what
> > >> happen with classList.
> > >>
> > >> in resume. I still don't want to make this discussion longer. I think
> we
> > >> have different opinions on this particular subject and the greatness
> of
> > >> royale is that it doesn't mind since if you and Harbs are betting for
> > >> className, we can remain Basic with the initial use (or the current
> > >>one).
> > >> For Jewel, I can bet for the same method MDL uses with classList and
> as
> > >>I
> > >> must to refactor half of the Jewel components to extend from UIBase
> > >> directly instead of Basic components counterparts, I can put a
> > >>JewelUIBase
> > >> piece between that uses classList in the way Jewel need. In fact
> Jewel,
> > >>and
> > >> any of the modern UI sets (Semantic, MDL, Bootstrap, ...) depends
> > >>heavily
> > >> in class selector assignation, hence the use of classList as a general
> > >> rule. So I think is natural to have this marked differentiation, while
> > >>in
> > >> Basic we should not expect people wants to deal with class selectors
> in
> > >>a
> > >> heavy use.
> > >>
> > >> Maybe I can wrong, but sincerely, if so I can't see where, but I
> firmly
> > >> believe in that, and for me is a clear definition of Jewel needs.
> > >>
> > >> Thoughts?
> >
> > My proposal lets our MDL and Jewel components use classList heavily in a
> > PAYG way.  It can be simplified if we are going to restrict setting of
> > className after adding to the DOM.  If you want to see what the code
> looks
> > like with that assumption try making the changes or I will do it.
> >
>
> Alex, I prefer you do this. My only requirements are:
>
> * Have a JewelUIBase instead of the same code in all components.
> * As I said, className will not be untouched after addToParent. That's a
> huge part in MDL and Jewel
> both sets add/remove/toggle styles at runtime. So make the changes
> modifying that rule in your mind.
> * Is critical for me that components extending doesn't have to add new
> methods that should be abstracted
> in JewelUIBase and we can use basic API calls since we are talking about
> heavy use (or principal use) in
> this kind of components set.
>
>
> >
> > I think we have proof that className is faster for when we want to use it
> > at init time.  I would like to see if we can create APIs for manipulation
> > the classList at runtime that isn't JS-only and asssumes there is an
> > element so folks can use those APIs at runtime instead being tempted to
> > change className.
> >
>
> I think that's the clue. While Basic makes all the duty before add to
> parent, MDL and Jewel are constantly
> adding, toggling and removing class selectors, that why we must put a clear
> line between how UIBase works
> (mainly like it's now) and how Jewel works (using heavy use of classList
> since is its nature, and 'll get rid completely of className use internaly)
>
> I hope we are reaching to something here. Could you change the
> implementation taking into account the differences discussed here?
>
> thanks
>
>
>
> >
> > My 2 cents,
> > -Alex
> > >>
> > >>
> > >
> > >
> > >--
> > >Carlos Rovira
> > >https://na01.safelinks.protection.outlook.com/?url=
> > http%3A%2F%2Fabout.me%2
> > >Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%
> > 7C9fbf7c0d5e994a9acb6008d5
> > >a1ae2520%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%
> > 7C636592691687691520&s
> > >data=TR5G34hZMVutbPgcwAzTtNlFR0mQb8quhoBewhsOnSc%3D&reserved=0
> >
> >
>
>
> --
> Carlos Rovira
> http://about.me/carlosrovira
>

Reply via email to